我正在尝试创建一个节点(节点的集合也很好),它接收许多流和索引,并输出索引指定的一个流。基本上,我想创建一个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而不是命令行界面。
答案 0 :(得分:0)
虽然使用一个过滤器 1 可能无法实现,但通过组合多个过滤器,一个用于音频或视频(取决于您选择的过滤器),当然可以做到这一点,以及其余的一组nullsink
或anullsink
过滤器。
例如,将是过滤器:
[v0][v1][a0][a1]avstreamselect=inputs=4:map=2[out]
接收两个视频流和两个音频流,并返回第三个流(第一个音频流),可以写成:
[a0][a1]astreamselect=inputs=2:map=0[out];
[v0]nullsink;[v1]nullsink
这里,我们为第一个流运行select,所有剩余的都映射到接收器。这个想法可能会被推广为仅使用nullsink
,anullsink
,copy
和acopy
,例如,我们也可以用4个节点编写它:
[a0]acopy[out];
[a1]anullsink;
[v0]nullsink;
[v1]nullsink
1 我仍然不知道是不是。如果实际可行,请随意删除。