![ffmpeg:將各種編解碼器附加到各種filtergraph輸出流 - 如何?](https://rvso.com/image/1654752/ffmpeg%EF%BC%9A%E5%B0%87%E5%90%84%E7%A8%AE%E7%B7%A8%E8%A7%A3%E7%A2%BC%E5%99%A8%E9%99%84%E5%8A%A0%E5%88%B0%E5%90%84%E7%A8%AEfiltergraph%E8%BC%B8%E5%87%BA%E6%B5%81%20-%20%E5%A6%82%E4%BD%95%EF%BC%9F.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,而不是一個filtergraph流。
我嘗試過的:
-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]
是第二個映射,因此其編解碼器使用-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
將設定編解碼器第二個音訊溪流
-c:a:2 CODEC
將設定編解碼器第三個音訊流等。
-c:v:0
對於視訊串流也將類似地工作。