用于选择视频/音频流的FFmpeg过滤器

时间:2017-06-23 21:05:49

标签: c filter ffmpeg

我正在尝试创建一个节点(节点的集合也很好),它接收许多流和索引,并输出索引指定的一个流。基本上,我想创建一个mux节点,如:

Node : Stream ... Number -> Stream

FFmpeg的过滤器图API似乎有两个过滤器:streamselect(用于视频)和astreamselect(用于音频)。在大多数情况下,他们似乎做我想做的事情:

[in0][in1][in2]streamselect=inputs=3:map=1[out]

此流将接收三个视频流,并输出第二个in1

您可以对音频流使用类似的过滤器:

[in0][in1]astreamselect=inputs=2:map=0[out]

将接收两个流并输出第一个in0

问题是,我是否可以创建一个过滤器,其中包含音频和视频流的列表,并仅根据流索引输出流?如下所示:

[v0][v1][a0][a1][a2]avstreamselect=inputs=5:map=3[out]

a1映射到out

如果它有助于我使用libavfilter C API而不是命令行界面。

1 个答案:

答案 0 :(得分:0)

虽然使用一个过滤器 1 可能无法实现,但通过组合多个过滤器,一个用于音频或视频(取决于您选择的过滤器),当然可以做到这一点,以及其余的一组nullsinkanullsink过滤器。

例如,将是过滤器:

[v0][v1][a0][a1]avstreamselect=inputs=4:map=2[out]

接收两个视频流和两个音频流,并返回第三个流(第一个音频流),可以写成:

[a0][a1]astreamselect=inputs=2:map=0[out];
[v0]nullsink;[v1]nullsink

这里,我们为第一个流运行select,所有剩余的都映射到接收器。这个想法可能会被推广为仅使用nullsinkanullsinkcopyacopy,例如,我们也可以用4个节点编写它:

[a0]acopy[out];
[a1]anullsink;
[v0]nullsink;
[v1]nullsink

1 我仍然不知道是不是。如果实际可行,请随意删除。