在视频帧上加入文字,可选择的办法有几个,比如可以找一找“编辑视频加广告”、或视频大师之类的工具,也可以写程序来实现(比如提取出所有帧,再对图片处理,再整合所有图片)。

本文介绍如何通过ffmpeg来做到在视频上加文字。

小白:ffmpeg?是你之前介绍的整车体验,还是要自己写程序?

花满楼:这次是整车体验,也就是使用ffmpeg命令来实现。

本文使用FFmpeg的drawtext滤镜来实现添加字幕。

小白:什么是滤镜?

花满楼:可以理解为视频的编辑功能,是FFmpeg强大的功能之一。

(1)支持滤镜filter

先要保证ffmpeg程序支持filter。否则在使用drawtext时,会看到这样的提示: 
把文字写到视频上_java

这时,查看FFmpeg编译配置后生成的头文件config.h,可以看:

#define CONFIG_DRAWTEXT_FILTER 0

是还没有打开drawtext滤镜的表现。

先安装yasm:

brew install yasm


小白:yasm是什么?

花满楼:汇编编译器。可以参考我之前介绍的“组成FFmpeg,为我所用”那篇文章,里面是编译FFmpeg的内容。

然后,配置FFmpeg(drawtext依赖于libfreetype):

./configure --enable-libfreetype  --enable-avfilter


这时,在配置输出中,可以看到: 
把文字写到视频上_java_02

而此时,config.h中是这样:

#define CONFIG_DRAWTEXT_FILTER 1


编译出ffmpeg工具即可: 
make

查一下ffmpeg工具,有没有支持到drawtext滤镜:

./ffmpeg -filters

可以看到,已经有这一项: 
把文字写到视频上_java_03


(2)使用drawtext滤镜

以一个视频为例,在没有加字幕前,这个视频是这样的: 
 

使用ffmpeg命令,这样加上字幕:

左右滚动的字幕:

./ffmpeg -i ~/Desktop/l.mp4 -vf drawtext="fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=white:fontsize=18:shadowy=0:\x='if(gte(t,1), (main_w-mod(t*100,main_w)), NAN)':y=(main_h-line_h-30):text='关注编程牛人,迅速变编程大牛。'" out.mp4


固定位置的字幕:

./ffmpeg -i ~/Desktop/l.mp4 -vf drawtext="fontfile=/Library/Fonts/YaHei.Consolas.1.11b.ttf:fontcolor=yellow:fontsize=18:shadowy=0:x=(w-tw)/2:y=(main_h-line_h-20):text='关注编程牛人,迅速变编程大牛。'" out.mp4



看一下滚动字幕的情况吧: 
把文字写到视频上_java_04