如何檢索給定軌道 ID 的音頻通道、比特率和其他質量測量值
我有這個程式碼:
track1=$(mkvmerge -I sample.mkv | sed -ne '/^Track ID [0-9]*: audio ([^)]*).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }' | cut -c1)
它將檢索匹配語言英語的 1 首曲目。
我想製作一個腳本來比較相同語言的音軌,並找到質量最高的音軌。
但是
mkvinfo
,mkvmerge
並且mediainfo
似乎無法檢索有關給定軌道 ID 的資訊,而且我不知道如何解析它們的完整輸出以僅檢索我需要的內容。這該怎麼做?我需要檢索猜測質量可能需要的所有內容,例如格式、比特率、通道數、大小,並將其儲存在
track1channels
.我對解決這個難題的其他解決方案持開放態度。
可能有許多不同的方法可以做到這一點,具體取決於您要使用什麼工具來解析輸出。一種方法是
mkvmerge
生成 JSON,然後使用jq
. 例如,要獲取所有音軌:mkvmerge --identify --identification-format json sample.mkv | jq '.tracks[] | select(.type=="audio")'
您可以在 中指定各種標準
jq
,例如.id=="2"
軌道 2 等。也許您甚至可以使用 進行比較/排序jq
,具體取決於您想要做什麼,請參閱man jq
詳細資訊。您還可以將一些過濾後的輸出儲存
jq
在 shell 變數中,並使用多次jq
呼叫將所有欄位提取到其他 shell 變數中。(可能有一種方法可以並行執行,但我不知道)。編輯
至於比特率:我嘗試了一個
mkv
包含AAC
音頻的樣本,但一開始既沒有mediainfo
也沒有mkvinfo
給出純粹的音頻比特率。可能人們可以從其他資訊中計算它,例如用於此軌道的總位數和總持續時間,但我對 mkv 容器的內部結構不夠熟悉,無法確定哪個數字是哪個數字。
.tracks[] | select(.type=="audio")
讀取“流式傳輸該欄位中的所有資訊,track
然後選擇那些具有type
等於的欄位audio
”。說你得到類似的東西{ "codec": "AAC", "id": 1, "properties": { "audio_channels": 2, "audio_sampling_frequency": 44100, "codec_id": "A_AAC", "codec_private_data": "1210", "codec_private_length": 2, "default_duration": 23219954, "default_track": true, "enabled_track": true, "forced_track": true, "language": "und", "minimum_timestamp": 0, "number": 2, "uid": 2897612726 }, "type": "audio" }
然後將其保存到文件或變數中。將其通過管道傳輸到第二個
jq
命令中,例如jq '.properties.audio_channels'
獲取子欄位。我不確定您打算如何循環多個軌道或您想要做什麼,但您可以僅使用jq
查詢來做很多事情。編輯
要在一行中獲取 id、編解碼器名稱、編解碼器 id 和通道數,請執行以下操作
jq '[[.id, .codec, .properties.codec_id, .properties.audio_channels] | map(tostring) | join(",")] | join("\n")'
在保存的值上(或添加到原始表達式)。
外部
[...]
擷取JSON記錄流,內部[...]
構造一個列表,將數字轉換為字元串後可以join
用逗號編輯,然後外部列表也join
由換行符編輯。我想如果有必要的話,可以用命令行選項去掉引號。還要查看
sort
是否要先按頻道數量排序,等等。這真的變成了一個“我如何
jq
正確使用”的問題,所以也許Google一個jq
教程,或者提出一個新問題/新問題?