Shell-Script

如何檢索給定軌道 ID 的音頻通道、比特率和其他質量測量值

  • January 14, 2018

我有這個程式碼:

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 首曲目。

我想製作一個腳本來比較相同語言的音軌,並找到質量最高的音軌。

但是mkvinfomkvmerge並且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教程,或者提出一個新問題/新問題?

引用自:https://unix.stackexchange.com/questions/415134