首页 / FFmpeg 入门教程 / 文字、水印与画面叠加

FFmpeg 入门教程

文字、水印与画面叠加

本教程共 32 篇 · 第 25 篇 · 更新于 2026-08-09 · 约 5 分钟阅读

FFmpegdrawtextoverlay水印字幕画中画滤镜

本节目标:会用 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,如 yellow0xFFFF00
  • xy:文字左上角坐标

指定字体

默认字体在不同系统上不一样,建议明确指定字体文件,避免乱码:

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=... 凑合。