给视频批量添加水印是内容创作者和后端转码服务的常见需求。FFmpeg作为命令行转码的事实标准,提供了overlay与drawtext两类滤镜分别处理图片与文字图层。掌握它们的参数含义与坐标系统,就能在不借助专业非编软件的前提下,用一条命令完成带标识的输出。

图片水印的叠加原理与坐标系统
FFmpeg处理图片水印的核心是overlay滤镜。它要求输入至少两个流:主画面(通常是视频)与叠加层(图片)。在滤镜图中,用方括号别名标记流,例如[0:v]代表第一个输入的视频流,[1:v]代表第二个输入的图片流。overlay会把第二个流绘制到第一个流之上,其位置由x和y两个表达式决定,默认值是0,也就是左上角。
坐标系统的原点在左上角,向右为x正方向,向下为y正方向。如果你希望水印出现在右下角,并且距离边缘二十像素,就不能写死像素值,因为不同视频分辨率不同会导致位置比例失调。此时应使用内置变量:main_w表示主画面宽度,main_h表示主画面高度,overlay_w和overlay_h表示水印图片的宽高。通过x=main_w-overlay_w-20与y=main_h-overlay_h-20,可以让任何分辨率的视频都把图片贴在右下角内侧。
下面是一条完整的命令示例,将logo.png以右下角方式叠加到input.mp4并输出out.mp4:
ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=x=main_w-overlay_w-20:y=main_h-overlay_h-20" -c:a copy out.mp4
需要注意,如果图片带有透明通道(如PNG),overlay会保留透明度,这是相比烧录字幕更优的地方。若使用JPEG这类无透明格式,图片矩形区域会完全遮挡视频内容。另外,-c:a copy表示音频流直接复制不重编码,能显著提升处理速度并避免音质损失。
文字水印的drawtext滤镜配置
文字水印不使用overlay,而是由drawtext滤镜直接在视频帧上渲染文本。该滤镜依赖系统字体文件,必须通过fontfile参数指定字体路径,例如在Linux上可能是/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf,Windows上可能是C:WindowsFontsarial.ttf。文本内容用text参数传入,也可用textfile读取外部文件。
位置控制同样依靠x与y表达式,并且支持时间戳变量t来实现滚动或闪烁效果。比如x=w-tw-10:y=10表示固定在右上角(tw是文字宽度),而x=w-mod(t*100,w+tw)则让文字从右向左滚动。这里的反斜杠用于转义冒号或逗号,避免被滤镜图语法误解析,必须原样保留。
以下示例在视频左上角显示当前时间码,并设定字体大小与颜色:
ffmpeg -i input.mp4 -vf
"drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:
text='%{pts:hms}':x=10:y=10:fontsize=24:fontcolor=white"
-c:a copy out.mp4
中文文字水印要确认字体文件支持中文字形,否则会渲染成方块。部分环境还需设置text_shaping=1以正确处理复杂文字排版。drawtext还支持box参数绘制背景框,提升在亮色画面上的可读性,例如box=1:boxcolor=black@0.5添加半透明黑底。
多水印组合与性能优化策略
实际业务中常需同时添加图片logo与文字版权信息。FFmpeg允许在一条filter_complex中串联多个滤镜,前一个的输出作为后一个的输入。典型写法是先overlay图片,再对结果用drawtext加文字,中间用方括号别名衔接,例如[0:v][1:v]overlay=...[v1];[v1]drawtext=...[v2]。这样只需一次解码与一次编码,比分开执行两条命令效率更高。
位置控制的进阶用法包括条件显示与动态布局。例如只在视频前十分之一时间显示水印,可用表达式enable='lt(t,10)'挂在overlay或drawtext上。对于竖屏与横屏混合的素材,可结合if表达式判断main_h>main_w来切换水印坐标,避免手机视频上水印跑到画面外。这些逻辑虽写在命令行里,但本质就是滤镜图的脚本化。
性能方面,若仅添加水印而不改变分辨率或帧率,可尝试-c:v libx264 -crf 18保持高画质,并对音频复制。当处理4K素材时,overlay的像素对齐可能成为瓶颈,此时可先缩放水印图片到目标尺寸再传入,减少每帧的缩放计算。另外,使用-preset veryfast能在几乎无视觉差异下缩短编码耗时。下面示例组合了图片与文字,并将水印限制在右下角与底部居中:
ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=x=main_w-overlay_w-30:y=main_h-overlay_h-30[v1]; [v1]drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf: text='Copyright':x=(w-tw)/2:y=main_h-th-20:fontsize=20:fontcolor=yellow[v2]" -map "[v2]" -map 0:a -c:a copy -c:v libx264 -crf 20 out.mp4
上述命令中,-map明确选取处理后的视频流与原始音频流,防止滤镜图输出干扰默认流选择。通过灵活运用变量与表达式,FFmpeg的水印功能足以覆盖绝大多数发布与保护场景,而无需引入重量级视频编辑工具。
FFmpegwatermarkvideo_processing修改时间:2026-08-18 17:06:31