Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于选择视频/音频流的FFmpeg过滤器_C_Filter_Ffmpeg - Fatal编程技术网

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

C 用于选择视频/音频流的FFmpeg过滤器,c,filter,ffmpeg,C,Filter,Ffmpeg,我正在尝试创建一个节点(一组节点也可以),它接收多个流和一个索引,并输出一个由索引指定的流。基本上,我想创建一个mux节点,类似于: Node : Stream ... Number -> Stream [v0][v1][a0][a1][a2]avstreamselect=inputs=5:map=3[out] FFmpeg的filter graph API似乎有两个过滤器来实现这一点:streamselect(用于视频)和astreamselect(用于音频)。在大多数情况下,他们似

我正在尝试创建一个节点(一组节点也可以),它接收多个流和一个索引,并输出一个由索引指定的流。基本上,我想创建一个mux节点,类似于:

Node : Stream ... Number -> Stream
[v0][v1][a0][a1][a2]avstreamselect=inputs=5:map=3[out]
FFmpeg的filter graph API似乎有两个过滤器来实现这一点:
streamselect
(用于视频)和
astreamselect
(用于音频)。在大多数情况下,他们似乎做了我想做的事:

[in0][in1][in2]streamselect=inputs=3:map=1[out]
此流将接收三个视频流,并在1中输出第二个

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

[in0][in1]astreamselect=inputs=2:map=0[out]
它将接收两个流并在0中输出第一个

问题是,我是否可以创建一个过滤器,该过滤器接收音频和视频流的列表,并仅基于流索引输出流?比如:

Node : Stream ... Number -> Stream
[v0][v1][a0][a1][a2]avstreamselect=inputs=5:map=3[out]
哪个映射到
a1
out


如果有帮助的话,我使用的是libavfilter C API,而不是命令行界面。

虽然一个过滤器不可能做到这一点,但可以通过组合多个过滤器来做到这一点,一个用于音频或视频(取决于您选择的过滤器),还有一堆
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我仍然不知道它是不是。如果可能的话,您可以随意删除它