在 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.ttf
drawtext