FFmpeg实现RTMP流叠加PNG幻灯片并输出RTMP流的问题求助
问题解决与实现方案
一、修复当前命令错误
你遇到的错误是因为同时对同一个输出流使用了-vf和-filter_complex,FFmpeg不允许这种操作。需要将scale滤镜整合到filter_complex的处理链中,修改后的单图片叠加命令如下:
exec_static /usr/bin/ffmpeg -i "rtmp://urltortmp" -i 1.png -filter_complex "[0:v]scale=1280:trunc(ow/a/2)*2[vscaled];[vscaled][1:v]overlay=10:main_h-overlay_h-10[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a aac -b:v 1920k -b:a 64k -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/live/std 2>>/var/log/nginx/ffmpeg-std.log;
关键修改说明
- 将主视频流
[0:v]先执行scale缩放,生成新的视频流[vscaled] - 用缩放后的流与图片流
[1:v]执行overlay叠加,生成最终输出流[vout] - 通过
-map "[vout]"指定输出视频流,-map 0:a映射原RTMP流的音频,避免丢失音频
二、实现多PNG幻灯片轮播效果
假设你有按数字命名的图片(如1.png、2.png、3.png),要实现每张图片显示5秒、无限循环轮播的效果,命令如下:
exec_static /usr/bin/ffmpeg -i "rtmp://urltortmp" -f image2 -framerate 1/5 -i %d.png -filter_complex "[1:v]loop=loop=-1:size=3[vslides];[0:v]scale=1280:trunc(ow/a/2)*2[vscaled];[vscaled][vslides]overlay=10:main_h-overlay_h-10[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a aac -b:v 1920k -b:a 64k -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/live/std 2>>/var/log/nginx/ffmpeg-std.log;
参数说明
-f image2 -framerate 1/5 -i %d.png:按数字序列读取图片,1/5表示每张图片显示5秒(每秒1/5帧)[1:v]loop=loop=-1:size=3[vslides]:将图片流无限循环(loop=-1),size=3对应图片总数(如果有5张就改成5)- 如果图片尺寸不一致,可在图片流处理中加入统一缩放:
[1:v]scale=300:45,loop=loop=-1:size=3[vslides](将所有图片缩放到300x45)
三、额外注意事项
- 确保所有PNG图片的路径正确,若图片不在当前执行目录,需写全路径(如
/path/to/images/%d.png) - 如果出现颜色异常,可在图片流中加入格式转换滤镜:
[1:v]format=yuv420p,loop=loop=-1:size=3[vslides],统一像素格式与主视频匹配
内容的提问来源于stack exchange,提问作者anders larsson
相关产品推荐
相关产品推荐

