《ffmpeg basics》中文版 -- 10.在视频上添加文本

10.在视频上添加文本

​ 视频中的文本性数据可以显著提升它的信息质量。

​ 信息质量:information quality,简称IQ,画面越清晰,内容越丰富,则IQ越大。

关于在视频上添加文本的简介

​ 在视频上添加文本最常见的方法有两种:一种是前面介绍的视频覆盖技术,一种是使用字幕。而更高级的选择则是使用 drawtext filter,它提供了更灵活高级的性能,其详细描述如下:

在这里插入图片描述

在这里插入图片描述

​ 例如,我们想要绘制白底黑色的文本:“Welcome”,它使用 Arial 字体,位于默认的左上角,则我们可以使用命令:

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=/Windows/Fonts/arial.ttf:text=Welcome

​ 在 Linux 中,FFT 字体文件位于 /usr/share/fonts/TTF 文件夹中。命令的结果如下:

在这里插入图片描述

​ 如果字体文件的路径很难指定(比如,所在目录路径很深,不易输入),那么可以把字体文件拷贝到当前目录,这样我们就能简化之前的命令:

ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcome

​ 当要在 ffmpeg 中使用 drawtext filter,那么我们应该省略 “-f lavfi -i color=c=white” ,并加入输入文件和输出文件:

ffmpeg -i input -vf drawtext=fontfile=arial.ttf:text=Welcome output

​ 为了将关注点转移到其他参数上,后续命令中的字体文件均默认位于当前目录,用户可以根据字体文件实际的位置来调整这个参数。

文本位置

​ 文本的位置可以使用 x 和 y 两个参数指定,对它们设置值时,除了数字之外,还可以使用数学表达式来赋值,表达式中可以有 drawtext filter 描述中的变量,也可以使用ffmpeg中内置的数学公式,如 rand() 能返回一个随机数。

设置水平位置

​ 水平位置由参数 x 指定,例如想要将水平位置设置为距离左边框 40 pix 的位置,那么此时 x=40 。当 x=(w-tw)/2 时,文本在水平方向将位于中心位置,其中 w 为帧的宽度,tw 为文本的宽度。而想要将文本右对齐,那么可以使用表达式 x=w-tw。

设置垂直位置

​ 垂直位置由参数 y 指定,例如想要将垂直位置设置为距离顶边框 50 pix 的位置,那么此时 y = 50 。当 y=(h-th)/2 时,文本在垂直方向将位于中心位置,其中 h 为帧的高度,th 为文本的高度。而想要将文本底对齐,那么可以使用表达式 y=h-th。

​ 下面的例子会将文本放置在视频帧的中心位置。请注意:当文本中有空格或者tab等不可见字符时,要使用引号将文本整个括起来,而有时 ffmpeg 要求我们将 drawtext 的所有参数用括号括起来。因此在下面的例子中,我们对全部参数使用双引号,对文本使用单引号(也可以外面使用单引号,内部使用双引号):

ffplay -f lavfi -i color=c=white -vf
drawtext="fontfile=arial.ttf;text='Good day';x=(w-tw)/2:y=(h-th)/2"

在这里插入图片描述

设置字体大小和颜色

​ 为了让字体看起来更加明显和有趣,我们可以设置字体的大小和颜色,默认字体大小为 16 pix。我们可以使用 fontcolor 和 fontsize 来分别设置字体的颜色和大小,例如:

ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

在这里插入图片描述

​ 现在,我们将白底绿字修改为绿底黄字,并将字体调整为 40:

ffplay -f lavfi -i color=c=blue -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=yellow:fontsize=40"

​ 颜色也可以使用其他格式指定,如#ff0000等,请查阅第一章节关于颜色的描述。

在这里插入图片描述

动态文本

​ 在 drawtext filter 的描述中,有一个变量 t ,它表示当前视频播放的时间,我们可以在 x 和 y 中使用它作为表达式的一部分,这样我们就可以随时间改变文本的位置。

水平移动文本

​ 想要在视频帧中水平移动文本,我们需要为 x 参数指定包含 t 变量的表达式。例如,如果想让文本从右到左每秒移动 n 个像素,那么可以使用 x=w-t*n。如果想要修改方向为从左到右,那么 x = w+t*n。例如,想要显示在顶部移动的文本,命令如下:

ffmpeg -f lavfi -i color=c=#abcdef -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=drakorange:fontsize=30" output

在这里插入图片描述

​ 更常见的例子是文本位于底部,此时文本来自于一个文件,其中仅包含一行很长的文字。例如:

ffmpeg -f lavfi -i color=c=orange -vf drawtext="fontfile=arial.ttf:textfile=info.txt:x=w-t*50:y=h-th:fontcolor=blue:fontsize=30" output

​ 其中,info.txt的内容如下:

This is a text added to the orange background with a drawtext filter using an Arial font with a 30 pixels font size.

​ 第 5 秒时的效果图:

在这里插入图片描述

垂直移动文本

​ 将文本从底部移动到顶部是非常常见的,如在电影的结尾,就会以这种形式显示电影的制作人,演员,日期等信息。想要在视频帧中垂直移动文本,我们需要为 y 参数指定包含 t 变量的表达式。例如,如果想让文本从上到下每秒移动 n 个像素,那么可以使用 y=t*n 。如果想要修改方向为从下到上,那么 y=h-t*n 。下面的例子将显示Credits文件中的文本,并从底部以 100 pix 每秒的速度向上移动。Credits 文件中的内容(每一行的开头都有空格):

	Production: FFmpeg User
	Date: December 2012
	Filter: drawtext

命令如下:

ffmpeg -i palms.avi -vf drawtext="fontfile=arial.ttf:textfile=Credits:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30" clip.mp4

效果图:

在这里插入图片描述

H&A
发布了7 篇原创文章 · 获赞 4 · 访问量 823

猜你喜欢

转载自blog.csdn.net/qq_34305316/article/details/103937279