我有 2 个从 filtergraph 映射出来的 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]
分配其编解码器。-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
对于视频流来说其工作方式类似。