ffmpeg:将各种编解码器附加到各种过滤器图输出流——如何做?

ffmpeg:将各种编解码器附加到各种过滤器图输出流——如何做?

我有 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对于视频流来说其工作方式类似。

相关内容