当我们为了给视频文件添加文字、字幕或者水印而执行FFmpeg命令时可能会报错:No such filter: 'drawtext'。产生该问题的原因是drawtext这个filter没有被编译进ffmpeg的库里面(一般来讲直接从官网上下载的库都是不包含drawtext这个filter的),所以我们得更改编译选项重新编译FFmpeg的源码。这里博主已经为大家准备了编译好了的具有drawtext功能的FFmpeg了(基于ffmpeg-4.2.2版本,可在windows的32位和64位系统运行,链接为https://download.csdn.net/download/u014552102/12186578),如果大家不想编译,可以直接下载。如果想自己编译,请往下看。下面讲述如何在windows平台重新编译FFmpeg源码并生成具有drawtext功能的库的方法。
首先根据博主的另一篇博文《windows下使用msys2编译FFmepg源码》安装好msys2、在msys2中安装好常用的软件、下载FFmpeg源码到msys2中(这些内容在那篇博文中已经说得很详细了,这里就不再赘述了)。在重新编译FFmpeg源码之前,我们得先安装freetype(安装完后才能使用drawtext)、fontconfig(安装完后才能选择多种字体)、fribidi(安装完后才能使用字体变形)。
进入freetype官网:https://www.freetype.org/download.html。
或者直接进入网址:https://download.savannah.gnu.org/releases/freetype/。选个较最新版本的freetype源码(比如freetype-2.9.tar.gz)下载(这里如果是新手,最好选择跟博主同样的版本,否则接下来的编译可能会出现各种各样的问题)。
下载下来后解压到msys2安装目录的SourceCode目录下(SourceCode目录是博主自己创建的,专门用来存放需要编译的源码,详情请见博主的另一篇博文《windows下使用msys2编译FFmepg源码》)。
然后通过命令提示符进入msys2的安装目录即msys64下, 执行命令
msys2_shell.cmd -mingw32
在启动的窗口中执行命令:cd /SourceCode/freetype-2.9,进入msys2中freetype源码的目录,如下图所示:
然后按顺序执行命令:
./configure --prefix=/usr/local/freetype
make
make install
执行完后会在msys64/usr/local目录下生成freetype目录,生成的库和可执行文件就在msys64/usr/local/freetype/bin目录下,如下图所示,表示freetype安装成功了。
由于fontconfig编译需要依赖libxml2,所以我们得先下载安装libxml2。在官网 ftp://xmlsoft.org/libxml2/ 下载一个比较新版本的libxml2,比如libxml2-2.9.9.tar.gz,到msys2的安装目录下,解压。
然后通过命令msys2_shell.cmd -mingw32启动msys2窗口,在该窗口中进入libxml2源码的目录,按顺序执行命令:
./configure --prefix=/usr/local/libxml2
make
make install
其实各个软件在msys2中的安装的方法都是一样的,所以这里具体细节就不再赘述了。
老规矩,在https://www.freedesktop.org/wiki/Software/fontconfig/ 下载fontconfig,比如fontconfig-2.13.92.tar.gz,下载下来后,解压,然后执行命令:
export PKG_CONFIG_PATH=/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/freetype/lib/pkgconfig:$PKG_CONFIG_PATH
pacman -S gperf
./configure --enable-libxml2 --with-freetype-config=/usr/local/freetype/bin/freetype-config --prefix=/usr/local/fontconfig
make
make install
在https://github.com/fribidi/fribidi 下载fribidi-master.zip,下载下来后解压,然后执行命令:
pacman -S libtool
pacman -S autoconf
pacman -S automake
./autogen.sh
./configure --prefix=/usr/local/fribidi
make
make install
执行命令:
export PKG_CONFIG_PATH=/usr/local/freetype/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/fontconfig/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/fribidi/lib/pkgconfig:$PKG_CONFIG_PATH
./configure --enable-shared --enable-decoder=h264 --enable-parser=h264 --enable-libfreetype --enable-libfontconfig --enable-libfribidi --arch=x86_32 --prefix=/usr/local/ffmpeg
make
make install
执行完后会在msys64\usr\local\ffmpeg\bin目录下生成FFmpeg的库和可执行文件。然后我们将msys64\mingw32\bin下的dll、msys64\usr\local\fontconfig\bin下的dll、msys64\usr\local\freetype\bin、msys64\usr\local\fribidi\bin、msys64\usr\local\libxml2\bin下的dll都拷贝到 msys64\usr\local\ffmpeg\bin目录下,这样FFmpeg即具有drawtext功能。我们可以根据博文《ffmpeg # 为视频添加文字drawtext》中的例子去测试drawtext功能.