ffmpeg: さまざまなコーデックをさまざまなフィルターグラフ出力ストリームに接続する方法 -- 方法は?

ffmpeg: さまざまなコーデックをさまざまなフィルターグラフ出力ストリームに接続する方法 -- 方法は?

フィルターグラフからマッピングされた 2 つの ffmpeg オーディオ出力があります。

-filter_complex "[0:1]..bla-bla-bla..[ac3];[0:2]..bla-bla-bla..[dts]" -map "[dts]" -map "[ac3]"

次に、2 つのオーディオ ストリームをエンコードする必要があります。各ストリームに使用するコーデックを指定する方法が必要ですね。次のようになります。

-codec:[dts] dts -codec:[ac3] ac3

いいえ。これは「無効なストリーム指定子」を引き起こします。また、私が見つけたすべての例では、フィルターグラフ ストリームではなく、入力ストリームを参照する stream_specifier のみが表示されています。

私が試したこと:

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:dts dts -codec:ac3 ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:[dts] dts -codec:[ac3] ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:a:dts dts -codec:a:ac3 ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:a:[dts] dts -codec:a:[ac3] ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:[a:dts] dts -codec:[a:ac3] ac3

引用符を使ったバリエーションもすべて試しました(例:-codec:"[dts]")

これらすべてが「無効なストリーム指定子」を引き起こします。何かアイデアはありますか?

答え1

出力ストリームの中でマップされたストリームのストリーム インデックスを使用する必要があります。
インデックスはマップの順序によって決まります。

では-map "[dts]" -map "[ac3]" -codec:dts dts -codec:ac3 ac3
[ac3]は 2 番目のマッピングなので、そのコーデックは-c:1 ac3または を使用して割り当てられます-c:a:1 ac3

地図が であれば-map 0:v:1 -map "[dts]" -map 0:s:0 -map "[ac3]"
または-c:3 ac3-c:a:1 ac3

答え2

かなり確実な方法は、ストリームタイプごとにコーデックを設定することです。 -c:a CODECすべてのオーディオストリームのコーデックを設定します。

後から位置パラメータを追加すると、他のタイプのストリームをすべてカウントしなくても、異なるストリームを指定できます。

-c:a:0 CODECコーデックを設定します最初の音声ストリーム

-c:a:1 CODECコーデックを設定します2番目の音声ストリーム

-c:a:2 CODECコーデックを設定します3番目の音声ストリームなど。

-c:v:0ビデオストリームでも同様に動作します。

関連情報