一、文字水印 - drawtext 过滤器
1、drawtext 过滤器简介
drawtext 过滤器 是 FFmpeg 中的一个 视频过滤器 , 用于 在 视频画面帧 上绘制文本 , 也就是添加文字水印 , 也可用于添加 标题 , 字幕 等元素 ;
-
文字水印属性 : drawtext 过滤器 可以 在 视频画面 的任何位置添加任何文字内容 , 并可以 自定义文字的字体 / 大小 / 颜色 / 位置 等属性 ;
-
动态时间戳显示 : drawtext 过滤器 可以 使用 时间戳 显示 动态变化 的时间信息 , 如 : 在视频上显示从 视频开始 到 当前时间 的经过时间 ;
-
多语言支持 : 使用 drawtext 过滤器 可以 在视频中添加 包括 中文 的 多种语言的文本 ;
drawtext 过滤器 文档 : https://ffmpeg.org/ffmpeg-filters.html#drawtext-1 , drawtext 过滤器 在上述文档的 " 11.78 章节 绘制文本 " 章节 ;
2、drawtext 过滤器支持库
使用 drawtext 过滤器 的 前提是 :
- 已经 安装 FFmpeg 命令行工具 ;
- 安装的 FFmpeg 在 编译时 启用了如下库 :
- libfreetype : 字体引擎库 , 可访问多种字体格式文件 , 支持单色位图 , 反走样位图的渲染 ;
- libharfbuzz : 文本布局和字形渲染库 , 支持多种字体格式 , 有专门的处理逻辑来确保文本的正确排列和形状形成 ;
- libfontconfig : 配置和自定义字体访问的库 , 可根据特定的环境和用户需求 选择和调整字体设置 ;
- libfribidi : 从左到右和从右到左的双向文本渲染库 , 可确保文本的正确显示和布局 ;
如果没有启用上述函数库 , 则无法使用 drawtext 过滤器 ;
3、编译 FFmpeg 源码时启用 drawtext 过滤器配置
FFmpeg 中想要 使用 drawtext 过滤器 功能 , 需要 在编译 FFmpeg 时添加 对 FreeType / FontConfig / iconv 的支持 , 具体 就是使用 libfreetype 库在 视频画面帧的顶部 绘制 文本字符串 , 需要 启用的 编译配置如下 :
- 启用 libfreetype 配置 :
--enable-libfreetype
; - 启用 libharfbuzz 配置 :
--enable-libharfbuzz
; - 启用 libfontconfig 配置 :
--enable-libfontconfig
; - 启用 libfribidi 配置 :
--enable-libfribidi
;
上述编译配置 , 是在 编译 FFmpeg 源码之前 , 调用 ./configure
命令 , 后面带上上述编译配置 ;
具体的配置命令如下 :
./configure --enable-libfreetype --enable-libharfbuzz --enable-libfontconfig --enable-libfribidi
更多编译细节 , 参考 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 ) 十一、交叉编译配置 Shell 脚本 ( 重点 ) 博客 ,
- 首先 , 调用
./configure
命令 , 配置编译选项 ; - 然后 , 调用
make install
命令 , 正式编译 FFmpeg 源码 ;
二、drawtext 过滤器常用参数
1、设置文字参数 - text / textfile
text
参数 用于 设置要添加的 文本 , 参数值 类型是字符串 ;
参数选项 : text='Hello World'
;
完整的 过滤器 选项 : drawtext=text='Hello World'
, 如果有多个选项 , 使用 :
隔开 ;
完整命令 : 将 drawtext 过滤器放在双引号中 , 作为 -vf
参数值设置到 ffmpeg 命令中 ;
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!'" output.mp4
如果 text 参数设置的 文字字符串很多 , 可以写到文件中 , 使用 textfile
参数 进行设置 , 设置的是 字符串文件 的路径 ;
参考设置 : textfile='/path/to/textfile.txt'
;
ffmpeg -i input.mp4 -vf "textfile='/path/to/textfile.txt" output.mp4
2、设置背景盒子参数 - box / borderw / boxcolor
使用 box
参数 , 可以设置 文字水印 的 背景盒子 ;
显示 文字水印 时 , 可以显示一个背景盒子 , 这个盒子类似于 CSS 中的盒子 , 可以设置边框 , 背景颜色 , 边框可以分别设置 四个方向 的边框属性 , 如 宽度和颜色 ;
box
参数可设置三个值 :
- 1 : 绘制方框 ;
- 0 : 不绘制方框 ;
- borderw : 绘制带有指定边框宽度的方框 ;
配置示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':box=1:boxcolor=black" output.mp4
borderw 参数 :
boxborderw=10
设置上下左右边框 10 像素宽度 ;boxborderw=10|20
设置上下边框 10 像素宽度 , 左右边框 20 像素宽度 ;boxborderw=10|20|30
设置上边框 10 像素宽度 , 左右边框 20 像素宽度 , 下边框 30 像素宽度 ;boxborderw=10|20|30|40
设置上边框 10 像素宽度 , 右边框 20 像素宽度 , 下边框 30 像素宽度 , 左边框 40 像素宽度 ;
配置示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':borderw=2" output.mp4
使用 boxcolor
参数 , 可以设置 边框的颜色 , 颜色值可以设置 RGB 颜色值 / 英文名称 / 十六进制颜色值 ;
boxcolor=black
boxcolor=0xFF0000
boxcolor=#FF0000
配置示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':boxcolor=red:borderw=2" output.mp4
3、设置颜色值 - RGB / 十六进制 / 英文名称
颜色值设置 : 在 FFmpeg 中的过滤器中 , 可使用如下方式设置颜色值 :
- RGB 颜色值 : 使用 RGB 颜色值 来表示颜色 , 如 : 0xFF0000 ;
- 颜色英文名称 : 使用 颜色的英文名称 表示颜色 , 如 : white 白色 , black 黑色 ;
- 十六进制颜色值 : 使用 十六进制颜色值 表示颜色 , 如 : #FF0000 红色 , #FFFFFF 白色 ;
在上述使用 boxcolor
参数 可 进行如下设置 :
boxcolor=black
boxcolor=0xFF0000
boxcolor=#FF0000
4、设置字体参数 - font / fontsize / fontcolor
font
参数 设置 字体文件的路径 或 字体名称 ;
- 字体名称 必须是 系统中已安装的字体的名称 ,
font=Arial
; - 字体文件的路径 , 一般是 ttf 格式的文件路径 ,
font=/path/to/font.ttf
;
代码示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':font=/path/to/font.ttf" output.mp4
fontcolor
参数 可用于设置 文本水印 的字体颜色 , 颜色值可以设置 RGB 颜色值 / 英文名称 / 十六进制颜色值 ;
fontsize
参数 用于设置 文本水印 的 字体大小 , 单位是像素 , 如 : fontsize=24
表示字体大小为 24 像素 ;
代码示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:font=/path/to/font.ttf:fontsize=24:fontcolor=white" output.mp4
在 Windows 中可以在 " 个性化 / 字体 " 中查看已安装的字体 ;’
Mac 和 Linux 有各自的查询系统已安装字体的方法 ;
5、设置水印位置参数 - x / y
drawtext 过滤器 中 使用 x 参数 和 y 参数 设置文本水印的位置 ;
- x 参数 用于指定 文本水印 相对于 视频画面帧 左上角的 水平位置 , 单位是 像素 ;
- y 参数 用于指定 文本水印 相对于 视频画面帧 左上角的 垂直位置 , 单位是 像素 ;
命令行示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:fontcolor=white" output.mp4
6、设置水印透明度参数 - alpha
alpha
参数 可用于 设置 文本水印 的透明度 , 透明度值 范围是 0 到 1 之间的浮点数 ,
- 0 表示完全透明
- 1 表示完全不透明
命令行示例 : 下面的命令中设置了 0.5 透明度 ;
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:fontcolor=white:alpha=0.5" output.mp4
三、drawtext 过滤器添加水印示例
1、添加水印 - 基础设置
执行
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:fontcolor=white" output.mp4
命令 , 就会在 输入视频 的 100x100 位置处 , 绘制 24 像素大小的 白色 文本水印 , 水印内容是 “Hello, World!” 字符串 ;
2、添加水印 - 设置背景框和文本颜色
执行
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:box=1:fontcolor=green" output.mp4
命令 , 在前面的基础上设置文本框背景 , 默认是白色的 , 此处字体需要设置成 绿色的 ;
执行结果如下 :
3、添加水印 - 显示当前时间
执行
ffmpeg -re -i input.mp4 -vf "drawtext=text='Hello, World! %{localtime\:%Y\-%m\-%d %H-%M-%S}':x=100:y=100:fontsize=24:box=1:fontcolor=green" output.mp4
命令 , 在前面的基础上增加时间显示 , 时间显示 文本可设置为 %{localtime\:%Y\-%m\-%d %H-%M-%S}
格式 , 可以拼接到字符串中 ;
注意 , 在命令中需要添加 -re 参数 , 否则时间更新可能不及时 , 每隔几秒才跳一下 ;
执行结果如下 :
4、添加水印 - 定时显示水印
执行
ffmpeg -re -i input.mp4 -vf "drawtext=text='Hello, World! %{localtime\:%Y\-%m\-%d %H-%M-%S}':x=100:y=100:fontsize=24:box=1:fontcolor=green:enable=lt(
mod(t\,3)\,1)" output.mp4
命令 , 在前面的基础上增加 enable
参数用于指定何时应用滤镜效果 ;
enable=lt(mod(t\,3)\,1)
是一个表达式 , 用于控制滤镜的启用时机 ;
t
表示时间 , 单位是 秒 ;mod(t\,3)
表示 对 时间 进行 模 3 运算 , 即 秒时间 除以 3 的余数 ;lt(mod(t\,3),1)
表示 将mod(t\,3)
的计算结果 与 1 进行比较 , 如果相等返回 1 , 如果不等 返回 0 ;
enable=lt(mod(t\,3),1)
的 整体效果 是 : 每 3 秒的周期中的 第一秒时启用滤镜效果 , 在后续的 2 秒内禁用滤镜效果 , 实现了 周期性地启用和禁用滤镜效果 ;
更多的 表达式 内容 参考 https://ffmpeg.org//ffmpeg-utils.html#Expression-Evaluation 文档 的
执行效果 :
5、添加水印 - 跑马灯效果
执行
ffmpeg -re -i input.mp4 -vf "drawtext=text='Hello, World! %{localtime\:%Y\-%m\-%d %H-%M-%S}':x=mod(100*t\,w):y=abs(sin(t))*h*0.7:fontsize=24:box=1:fontcolor=green" output.mp4
命令 , 实现跑马灯效果 , 主要是实时改变 x 和 y 的坐标 ;
执行效果 :