使用scale2ref加水印异常:视频适配水印而非水印适配视频
批量视频添加适配水印的FFmpeg问题排查
问题背景
我试图用1200x600的.png水印文件,为分辨率从360x141到2480x1280不等的批量视频添加水印。原本以为FFmpeg的scale2ref滤镜可以实现需求,但转换时出现问题——所有输出视频都被缩放到1200x600,而非保持原视频分辨率,让水印适配视频尺寸。
根据scale2ref文档说明:
叠加前将字幕流(b)缩放至匹配主视频(a)的尺寸
'scale2ref[b][a];[a][b]overlay'
我理解流[b]为水印文件,流[a]为视频文件,写出的FFmpeg命令如下(作为bash脚本部分):
while read -r line || [[ -n "$line" ]]; do fn_out="w$line"; (/u2/vidmarktest/scripttesting/files_jeud8334j/dioffmpeg/ffmpeg -report -nostdin \ -i /u2/vidmarktest/scripttesting/files_jeud8334j/"$line" \ -i /u2/vidmarktest/mw1.1200x600.png \ -filter_complex "scale2ref[b][a];[b][a]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" \ /u2/vidmarktest/scripttesting/files_jeud8334j/converted/"$fn_out" -c:v libx265); done < videos.txt
需要说明:有人建议交换[a]和[b]的overlay顺序,但这样会导致水印被视频遮挡,只有[b][a]overlay才能让水印覆盖在视频上方。现在始终无法实现水印适配视频分辨率的需求,想知道对FFmpeg和scale2ref的理解存在哪些误区?
问题分析与解决
你的核心误区是搞反了scale2ref的输入流顺序和缩放目标:
scale2ref的语法逻辑是:第一个输入流是要被缩放的对象,第二个输入流是参考基准(保持尺寸不变)。- 你写的
scale2ref[b][a]没有指定输入流,FFmpeg默认按-i的顺序取流,也就是把第一个输入的视频流作为缩放对象,去匹配第二个输入的水印流尺寸,这就是为什么所有视频都被改成了水印的1200x600分辨率。
正确的做法是:明确指定水印流作为被缩放对象,视频流作为参考基准,让水印适配视频尺寸,同时保持视频分辨率不变。调整后的滤镜链应该是:
-filter_complex "[1:v]scale2ref[a][b];[b][a]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2"
滤镜链解释
[1:v]指定第二个输入(水印文件)作为要缩放的流;scale2ref[a][b]中,[a]是缩放后的水印,[b]是保持原始尺寸的视频流(参考基准)。[b][a]overlay将缩放后的水印[a]叠加到原视频[b]上,既保证视频分辨率不变,又让水印适配视频尺寸,同时满足水印在视频上方的需求。
修改后的完整bash命令
while read -r line || [[ -n "$line" ]]; do fn_out="w$line"; (/u2/vidmarktest/scripttesting/files_jeud8334j/dioffmpeg/ffmpeg -report -nostdin \ -i /u2/vidmarktest/scripttesting/files_jeud8334j/"$line" \ -i /u2/vidmarktest/mw1.1200x600.png \ -filter_complex "[1:v]scale2ref[a][b];[b][a]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" \ /u2/vidmarktest/scripttesting/files_jeud8334j/converted/"$fn_out" -c:v libx265); done < videos.txt
额外优化(可选)
如果希望水印按比例缩放,避免小视频被水印占满(比如限制水印最大为视频宽高的20%),可以给scale2ref添加参数:
[1:v]scale2ref=w='min(main_w*0.2, iw)':h='min(main_h*0.2, ih)'[a][b]
该参数会让水印按自身宽高比缩小,最大不超过视频宽高的20%,适配不同尺寸的视频。
内容的提问来源于stack exchange,提问作者Robert Dio
相关产品推荐
相关产品推荐

