FFmpeg使用xfade转场与drawtext添加文字时出现流匹配错误的问题排查
FFmpeg使用xfade转场与drawtext添加文字时出现流匹配错误的问题排查
嘿,这个问题我之前折腾FFmpeg的时候也碰到过,咱们来理清楚问题出在哪,再给你修正后的方案:
错误根源
xfade是专门用来衔接两个视频流的转场滤镜,它必须同时接收两个输入流(前一段视频的结尾 + 后一段视频的开头)才能工作。但你现在的写法是把xfade直接加到单个图片的滤镜链里(比如[0]xfade=...),相当于只给了它一个输入流,滤镜找不到第二个必填的输入,自然就抛出了“Cannot find a matching stream for unlabeled input pad 1”的错误。
修正后的命令写法
正确的思路是:先给每个图片流处理好文字和像素比例,再用xfade把它们依次首尾衔接起来。下面是修正后的完整命令:
ffmpeg -loop 1 -t 5 -i ./img/img0.jpg -loop 1 -t 5 -i ./img/img1.jpg -loop 1 -t 5 -i ./img/img2.jpg -loop 1 -t 5 -i ./img/img3.jpg -t 20 -i audio.mp3 -filter_complex " [0]drawtext=fontfile='./Lato/Lato-Regular.ttf':text='Text1':fontcolor='#666333':fontsize=(h/30):x=50:y=20,setsar=1[v0]; [1]drawtext=fontfile='./Lato/Lato-Regular.ttf':text='Text1':fontcolor='#666333':fontsize=(h/30):x=50:y=20,setsar=1[v1]; [2]drawtext=fontfile='./Lato/Lato-Regular.ttf':text='Text1':fontcolor='#666333':fontsize=(h/30):x=50:y=20,setsar=1[v2]; [3]drawtext=fontfile='./Lato/Lato-Regular.ttf':text='Text1':fontcolor='#666333':fontsize=(h/30):x=50:y=20,setsar=1[v3]; [v0][v1]xfade=transition=dissolve:duration=1:offset=4[tmp1]; [tmp1][v2]xfade=transition=dissolve:duration=1:offset=8[tmp2]; [tmp2][v3]xfade=transition=dissolve:duration=1:offset=12,format=yuv420p[vid]" -map "[vid]" -map 4:a -c:v libx264 output.mp4
关键修正点说明
- 先处理单流效果:给每个图片输入先添加
drawtext(文字)和setsar=1(统一像素比例),生成四个独立的带文字视频流[v0]到[v3]。 - 用xfade依次衔接:
- 用
[v0][v1]xfade=...把第一张和第二张衔接,offset=4表示第一张播放到第4秒时开始1秒的溶解转场(刚好占满第一张5秒的时长)。 - 衔接后的临时流
[tmp1]再和[v2]衔接,offset=8对应前面已播放的时长(5秒第一张 + 4秒第二张非转场时间),确保转场时机正确。 - 最后把
[tmp2]和[v3]衔接,完成所有转场后加上format=yuv420p保证输出视频兼容绝大多数播放器。
- 用
- 灵活修改文字:如果每张图片需要不同的文字,只需要修改对应
drawtext里的text参数即可(比如把[1]对应的text='Text1'改成text='Text2')。
备注:内容来源于stack exchange,提问作者Imran Khan
相关产品推荐
相关产品推荐

