You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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. [1:v]指定第二个输入(水印文件)作为要缩放的流;scale2ref[a][b]中,[a]是缩放后的水印,[b]是保持原始尺寸的视频流(参考基准)。
  2. [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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:00:07