基于Nginx RTMP模块:FFmpeg多路视频流加水印配置失效求助
解决Nginx RTMP流添加水印并转码多分辨率的问题
首先看你当前命令的核心问题:你在filter_complex里已经做了水印叠加和流拆分,但后续每个输出又用了-vf(视频滤镜),这会覆盖掉之前filter_complex处理后的视频流,相当于水印白加了,而且滤镜链的顺序也不对。另外,-strict -2在新版本FFmpeg里已经不需要了,还有音频编码的参数可以优化下。
下面是修正后的完整命令,我把scale整合到filter_complex里,确保每个分流都带水印,同时简化了重复参数:
exec ffmpeg -i rtmp://localhost/$app/$name -i /mnt/pictures/flowtech.png \ -filter_complex "overlay=10:10,split=5[out1][out2][out3][out4][out5]; \ [out1]scale=480:trunc(ow/a/2)*2[v1]; \ [out2]scale=720:trunc(ow/a/2)*2[v2]; \ [out3]scale=960:trunc(ow/a/2)*2[v3]; \ [out4]scale=1280:trunc(ow/a/2)*2[v4]" \ -map '[v1]' -map 0:a -c:v libx264 -c:a aac -ac 1 -b:v 256k -b:a 32k -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/hlsall/$name_low \ -map '[v2]' -map 0:a -c:v libx264 -c:a aac -ac 1 -b:v 768k -b:a 96k -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/hlsall/$name_mid \ -map '[v3]' -map 0:a -c:v libx264 -c:a aac -ac 1 -b:v 1024k -b:a 128k -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/hlsall/$name_high \ -map '[v4]' -map 0:a -c:v libx264 -c:a aac -ac 1 -b:v 1920k -b:a 128k -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/hlsall/$name_hd720 \ -map '[out5]' -map 0:a -c copy -f flv rtmp://localhost/hlsall/$name_src \ >>/tmp/rtmp_log 2>&1;
关键修改点:
- 把所有视频滤镜(overlay、split、scale)都放到
filter_complex里,避免-vf覆盖之前的处理,保证每个输出流都先叠加水印再缩放 - 移除了过时的
-strict -2参数(新版本FFmpeg对AAC编码已经不需要这个兼容标记) - 把日志重定向改成
2>&1,这样错误日志也会写入到/tmp/rtmp_log,方便排查问题 - 用换行符格式化命令,可读性更强(Nginx里可以用反斜杠换行)
额外建议:
- 确保你的FFmpeg版本支持
libx264和aac编码器,可以用ffmpeg -encoders命令验证 - 检查
/mnt/pictures/flowtech.png的路径是否正确,FFmpeg需要能读取到这个水印文件 - 如果水印位置需要调整,可以修改
overlay=10:10的参数,比如overlay=W-w-10:H-h-10可以把水印放到右下角(W是视频宽度,w是水印宽度,H是视频高度,h是水印高度)
内容的提问来源于stack exchange,提问作者Frederick Eyland
相关产品推荐
相关产品推荐

