文字、水印与画面叠加
本教程共 32 篇 · 第 25 篇 · 更新于 2026-08-09 · 约 5 分钟阅读
本节目标:会用 drawtext 在视频上写字、显示时间、做滚动字幕;会用 overlay 把 logo、图片、另一段视频叠到画面任意位置。
视频处理里两类需求最常见:一是在画面上叠字(标题、台标、时间码),二是叠图片/视频(水印、画中画)。前者用 drawtext,后者用 overlay。
一、drawtext:在画面上写字
基础用法
ffmpeg -i input.mp4 -vf "drawtext=text='Hello FFmpeg':fontsize=48:fontcolor=white:x=40:y=40" output.mp4
参数一目了然:
text:要显示的文字fontsize:字号fontcolor:颜色(颜色名或0xRRGGBB,如yellow、0xFFFF00)x、y:文字左上角坐标
指定字体
默认字体在不同系统上不一样,建议明确指定字体文件,避免乱码:
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text='你好世界':fontsize=48:fontcolor=white:x=40:y=40" output.mp4
Windows 上字体路径如 C\:/Windows/Fonts/msyh.ttc(注意斜杠方向,冒号要转义);macOS 常用 /System/Library/Fonts/PingFang.ttc;Linux 常见 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf。
半透明底色 + 阴影
直接写字在花画面上可能看不清,可以加描边或半透明框:
ffmpeg -i input.mp4 -vf \
"drawtext=text='码上学':fontsize=40:fontcolor=white:borderw=2:bordercolor=black:x=20:y=20" \
output.mp4
borderw 是描边粗细,bordercolor 是描边颜色。白字黑边是万能搭配。
显示时间码
drawtext 支持大量扩展函数,%{pts} 可以显示时间戳:
ffmpeg -i input.mp4 -vf \
"drawtext=text='%{pts\:hms}':fontsize=32:fontcolor=yellow:x=20:y=20" \
output.mp4
%{pts:hms} 会格式化成 HH:MM:SS 的时间码。还可以叠加当前时间:
ffmpeg -i input.mp4 -vf \
"drawtext=text='%{localtime\:%Y-%m-%d %H\\:%M\\:%S}':fontsize=24:fontcolor=white:x=20:y=60" \
output.mp4
冒号在 drawtext 里是参数分隔符,所以格式串里的冒号要转义成 \:。
从外部文件读字幕
文字很长或要做歌词,用 textfile= 比直接写 text= 方便:
ffmpeg -i input.mp4 -vf "drawtext=textfile=subtitle.txt:fontsize=32:fontcolor=white:x=(w-text_w)/2:y=h-80" output.mp4
(w-text_w)/2 是让文字水平居中的常用表达式:w 是视频宽,text_w 是文字实际宽,相减除以 2 就是居中的 x 坐标。
滚动字幕(片尾鸣谢)
让文字从下往上滚:
ffmpeg -i input.mp4 -vf \
"drawtext=textfile=credits.txt:fontsize=36:fontcolor=white:x=(w-text_w)/2:y=h-50*t:fontfile=/path/to/font.ttf" \
output.mp4
t 是当前时间(秒),y=h-50*t 让文字每秒钟上移 50 像素。想快就调大系数,想慢就调小。
定时显示/隐藏
用 enable 表达式控制文字在哪个时间段出现:
ffmpeg -i input.mp4 -vf \
"drawtext=text='5 秒后出现,10 秒后消失':enable='between(t,5,10)':x=20:y=20:fontsize=32:fontcolor=red" \
output.mp4
between(t,5,10) 表示第 5 到 10 秒之间生效。
二、overlay:叠加图片和视频
overlay 把两个视频/图片叠在一起。第一个输入是底图,第二个输入是叠加层。
贴图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
overlay=x:y 指定 logo 左上角在底图上的坐标。(10,10) 就是左上角留 10 像素边距。
九个角位快速定位
overlay 里有内置变量:W/H 是底图宽高,w/h 是叠加层宽高。
| 位置 | 表达式 |
|---|---|
| 左上角 | overlay=10:10 |
| 右上角 | overlay=W-w-10:10 |
| 左下角 | overlay=10:H-h-10 |
| 右下角 | overlay=W-w-10:H-h-10 |
| 居中 | overlay=(W-w)/2:(H-h)/2 |
右下角水印最常见:
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-20:H-h-20" output.mp4
半透明水印
如果 logo 不带 alpha 通道,可以用 colorchannelmixer 调透明度:
ffmpeg -i input.mp4 -i logo.png -filter_complex \
"[1:v]format=rgba,colorchannelmixer=aa=0.4[logo];[0:v][logo]overlay=W-w-20:H-h-20" \
output.mp4
aa=0.4 表示透明度 40%。用 PNG 透明背景图效果最好,JPG 没有 alpha 通道。
画中画(PiP)
把另一段视频缩小后叠在角落:
ffmpeg -i main.mp4 -i sub.mp4 -filter_complex \
"[1:v]scale=320:-2[pip];[0:v][pip]overlay=W-w-20:H-h-20" \
output.mp4
先把第二段视频缩小到 320 宽,再叠在右下角。
定时出现的水印
和 drawtext 一样,overlay 也支持 enable:
ffmpeg -i input.mp4 -i logo.png -filter_complex \
"overlay=10:10:enable='between(t,5,15)'" output.mp4
logo 只在第 5–15 秒显示。
移动水印
让 logo 从左飞到右:
ffmpeg -i input.mp4 -i logo.png -filter_complex \
"overlay=x='mod(t*50,W-w)':y=H-h-20" output.mp4
x=mod(t*50,W-w) 让 x 坐标随时间每秒增加 50,碰到右边后回到左边循环。
三、drawtext + overlay 组合
一个命令里可以同时用多个滤镜,给视频加台标、标题、时间码:
ffmpeg -i input.mp4 -i logo.png -filter_complex \
"[0:v]drawtext=text='码上学出品':x=20:y=20:fontsize=28:fontcolor=white:borderw=1[v]; \
[v][1:v]overlay=W-w-20:20[out]" \
-map "[out]" output.mp4
Tip中文字体一定要指定
fontfile,否则可能显示成方框或乱码。Windows 上微软雅黑路径写作fontfile=C\:/Windows/Fonts/msyh.ttc,冒号和反斜杠的转义要特别小心;路径里用正斜杠最省事。叠水印用 PNG 比 JPG 好:PNG 支持透明背景,不会出现白色方块。如果只有 JPG,可以加
format=rgba,colorchannelmixer=aa=...凑合。