FFmpeg 相关文档 :
drawtext 过滤器 是 FFmpeg 中的一个 视频过滤器 , 用于 在 视频画面帧 上绘制文本 , 也就是添加文字水印 , 也可用于添加 标题 , 字幕 等元素 ;
drawtext 过滤器 文档 : https://ffmpeg.org/ffmpeg-filters.html#drawtext-1 , drawtext 过滤器 在上述文档的 " 11.78 章节 绘制文本 " 章节 ;
使用 drawtext 过滤器 的 前提是 :
如果没有启用上述函数库 , 则无法使用 drawtext 过滤器 ;
FFmpeg 中想要 使用 drawtext 过滤器 功能 , 需要 在编译 FFmpeg 时添加 对 FreeType / FontConfig / iconv 的支持 , 具体 就是使用 libfreetype 库在 视频画面帧的顶部 绘制 文本字符串 , 需要 启用的 编译配置如下 :
--enable-libfreetype
;--enable-libharfbuzz
;--enable-libfontconfig
;--enable-libfribidi
;上述编译配置 , 是在 编译 FFmpeg 源码之前 , 调用 ./configure
命令 , 后面带上上述编译配置 ;
具体的配置命令如下 :
./configure --enable-libfreetype --enable-libharfbuzz --enable-libfontconfig --enable-libfribidi
更多编译细节 , 参考 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 ) 十一、交叉编译配置 Shell 脚本 ( 重点 ) 博客 ,
./configure
命令 , 配置编译选项 ;make install
命令 , 正式编译 FFmpeg 源码 ;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
使用 box
参数 , 可以设置 文字水印 的 背景盒子 ;
显示 文字水印 时 , 可以显示一个背景盒子 , 这个盒子类似于 CSS 中的盒子 , 可以设置边框 , 背景颜色 , 边框可以分别设置 四个方向 的边框属性 , 如 宽度和颜色 ;
box
参数可设置三个值 :
配置示例 :
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
颜色值设置 : 在 FFmpeg 中的过滤器中 , 可使用如下方式设置颜色值 :
在上述使用 boxcolor
参数 可 进行如下设置 :
boxcolor=black
boxcolor=0xFF0000
boxcolor=#FF0000
font
参数 设置 字体文件的路径 或 字体名称 ;
font=Arial
;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 有各自的查询系统已安装字体的方法 ;
drawtext 过滤器 中 使用 x 参数 和 y 参数 设置文本水印的位置 ;
命令行示例 :
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:fontcolor=white" output.mp4
alpha
参数 可用于 设置 文本水印 的透明度 , 透明度值 范围是 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
执行
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:fontcolor=white" output.mp4
命令 , 就会在 输入视频 的 100x100 位置处 , 绘制 24 像素大小的 白色 文本水印 , 水印内容是 “Hello, World!” 字符串 ;
执行
ffmpeg -i input.mp4 -vf "drawtext=text='Hello, World!':x=100:y=100:fontsize=24:box=1:fontcolor=green" output.mp4
命令 , 在前面的基础上设置文本框背景 , 默认是白色的 , 此处字体需要设置成 绿色的 ;
执行结果如下 :
执行
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 参数 , 否则时间更新可能不及时 , 每隔几秒才跳一下 ;
执行结果如下 :
执行
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 文档 的
执行效果 :
执行
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 的坐标 ;
执行效果 :