![ffmpeg: さまざまなコーデックをさまざまなフィルターグラフ出力ストリームに接続する方法 -- 方法は?](https://rvso.com/image/1654752/ffmpeg%3A%20%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%87%E3%83%83%E3%82%AF%E3%82%92%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%B0%E3%83%A9%E3%83%95%E5%87%BA%E5%8A%9B%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%20--%20%E6%96%B9%E6%B3%95%E3%81%AF%3F.png)
フィルターグラフからマッピングされた 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
ビデオストリームでも同様に動作します。