FFmpeg - 过滤器链接和映射输出

FFmpeg - 过滤器链接和映射输出

在 FFmpeg 中,是否可以从过滤器链的中间映射输出?

例如,在此命令中:

ffmpeg -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50[txt1];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50[txt2];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50[txt3];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50[txt4]" -map "[txt4]" -t 10 -y ~/Desktop/mapping.mp4

这有效:-map“[txt4]”。当尝试-map“[txt3]”(或txt2或txt1)时,我得到“

带有标签‘txt3’的输出不存在于任何定义的过滤器图中,或已在其他地方使用。”

我想调用完整的命令并使用过滤器链的不同部分(-map [$val])来输出不同的文件。

谢谢

答案1

这是可能的,但我们必须使用分裂过滤器为“中间过滤器”。

当“中间过滤器”被用作其他过滤器的输入时,它会被该过滤器“消耗”,并且以后不能使用。


下面是使用一个命令从所有“中间过滤器”创建视频文件的示例:

ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4]" -t 10 -map "[txt1out]" mapping1.mp4 -t 10 -map "[txt2out]" mapping2.mp4 -t 10 -map "[txt3out]" mapping3.mp4 -t 10 -map "[txt4]" mapping4.mp4


为了分别对每个文件进行编码,我们可以添加流选择过滤器,位于过滤器链的末尾:

[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]

設定map=0以供選擇[txt1out],設定map=1以供選擇[txt2out]...

示例命令:

ffmpeg -y -f lavfi -i smptehdbars=rate=25:size=1920x1080 -filter_complex "[0:v]drawtext=text=text1:x=100/2:y=100:fontsize=50:fontfile=arial.ttf,split[txt1][txt1out];[txt1]drawtext=text=text2:x=200/2:y=200:fontsize=50:fontfile=arial.ttf,split[txt2][txt2out];[txt2]drawtext=text=text3:x=300/2:y=300:fontsize=50:fontfile=arial.ttf,split[txt3][txt3out];[txt3]drawtext=text=text4:x=400/2:y=400:fontsize=50:fontfile=arial.ttf[txt4];[txt1out][txt2out][txt3out][txt4]streamselect=4:map=1[out]" -t 10 -map "[out]" mapping2.mp4


注意:需要
添加才能在 Windows 中运行。fontfile=arial.ttfdrawtext

相关内容