特定のトラックIDのオーディオチャンネル、ビットレート、その他の品質測定値を取得する方法

特定のトラック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つのトラックを検索します。

同じ言語のオーディオトラックを比較し、最高品質のオーディオトラックを見つけるスクリプトを作成したいと思います。

ただしmkvinfomkvmergeおよびmediainfoは特定のトラックIDに関する情報を取得できないようです。必要な情報だけを取得するために出力全体を解析する方法がわかりません。

どうすればいいですか?フォーマット、ビットレート、チャンネル数、サイズなどの品質を推測するために必要なすべてを検索しますtrack1channels

私はこのパズルの他の解決策を探しています。

答え1

出力を解析するために使用したいツールに応じて、これを行う方法はいくつかあります。 1つの方法は、mkvmergeJSONを作成してからを使用してすべてのjqオーディオトラックを取得することです。

mkvmerge --identify --identification-format json sample.mkv | jq '.tracks[] | select(.type=="audio")'

トラック2など、jqさまざまな条件をで指定できます。実行したい操作に応じ.id=="2"て、を使用して比較/並べ替えることもできます。詳細についてはをご覧ください。jqman jq

jqフィルタ処理された出力の一部をシェル変数に保存し、複数のjq呼び出しを使用してすべてのフィールドを別のシェル変数に抽出することもできます。 (並列アプローチがあるかもしれませんが、わかりません。)

編集する

ビットレートについて:オーディオをmkv含むサンプルを試しましたが、最初から純粋なオーディオビットレートを提供しませんでした。トラックで使用されている総ビット数や総持続時間などの他の情報に基づいてこれを計算することもできますが、どの数値がどの数値であるかを把握するには、mkvコンテナの内部について十分な知識がありません。AACmediainfomkvinfo

.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などの2番目のコマンドにパイプします。jq '.properties.audio_channels'複数のトラックをどのように繰り返すのか、何をしたいのかわかりませんが、jqクエリだけでできることがたくさんあります。

編集する

1 行に ID、コーデック名、コーデック ID、チャネル数を取得するには、次の手順を実行します.

jq '[[.id, .codec, .properties.codec_id, .properties.audio_channels] | map(tostring) | join(",")] | join("\n")'

保存された値(または元の式に追加)

[...]JSONレコードストリームは外部からキャプチャされ、内部的にリストが編成されます。リストは[...]数字を文字列に変換してjoinカンマで編集でき、外部リストも改行joinを使用して編集されます。必要に応じて、コマンドラインオプションを使用して引用符を削除できるとします。

また、sortまずチャンネル番号でソートするかどうかなどを考慮してください。

これは実際に「これを正しく使用するにはどうすればよいですかjq?」という質問になります。したがって、Googleでjqチュートリアルを検索したり、新しい質問/質問をしたりすることもできます。

関連情報