【FFmpeg】Filter 过滤器 ③ ( 文字水印 - drawtext 过滤器 | drawtext 过滤器支持库编译配置 | drawtext 过滤器常用参数 )





一、文字水印 - 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 的坐标 ;

执行效果 :

在这里插入图片描述
在这里插入图片描述

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值