音视频技术应用(1)-使用VS2019来编译FFmpeg 环境搭建
一. 安装并配置msys2
这个工具主要用于模拟linux端的一些命令和指令。
下载地址:
msys2-x86_64-20210725_2.exe
链接: https://pan.baidu.com/s/1zOzoNzAt85KrccERo_9RQg 提取码: n64t
下载完成后双击exe进行安装,安装时间可能很长,请耐心等待安装结束。
然后打开VS2019的命令行工具,选择:x86 Native Tools Command Prompt for VS 2019, 右击以管理员权限运行:
注意:最好以管理员权限运行,否则后续在执行nmake install 指令时可能会发生错误,切记。
点击打开, cd 到msys2 安装的目录, 执行 msys2_shell.cmd -mingw32, 启动msys2的32位运行环境:
在新启动的msys2中执行 cl, 看是否能找到cl 编译器,如果提示:bash: cl: 未找到命令
则说明msys 控制台系统中并没有共享我们本地的VS2019的运行环境,因此需要将 VS2019的运行环境添加到 msys 的控制台系统当中,目的要保证能在msys的环境中要能运行VS2019的控制台。
打开刚才msys2的解压路径,找到:msys2_shell.cmd 文件,打开:
找到:
rem set MSYS2_PATH_TYPE=inherit
将其修改为:
set MSYS2_PATH_TYPE=inherit
允许msys 继承外部的环境变量:
关闭msys2的控制台窗口,然后重新在 VS2019的控制台窗口中执行:msys2_shell.cmd -mingw32
打开msys的控制台窗口后,再次执行cl, 若遇到乱码则是因为字符编码不一致导致的,可以右击msys2的标题栏,依次选择“Options”-"Text", 分别修改Locale 和 Character set 为 “zh_CN” 和 “UTF-8”
修改完毕后,回到msys的控制台,再次执行cl,这样就不会有乱码了:
到此为止,我们就已经把msys的环境装好了,并且已经包含了cl的命令行工具。
二. msys2 依赖环境安装
这里我们主要使用pacman来安装编译依赖工具,pacman 有点类似于ubuntu下的apt, 或是centos下的yum。
安装汇编工具,主要是在编译x264和ffmepg时会用到,如果不安装,在config中需要禁用汇编。
安装 nasm
打开msys 控制台窗口,执行 pacman -S nasm , 注意 S 大写
安装yasm
一个汇编工具,在编译x264 和 ffmpeg 时会用到,如果不安装,则需要在config中去禁用汇编。
安装 make cmake
项目编译工具,必须要安装,cmake 用于生成项目文件
安装 diffutils
比较工具,ffmpeg configure 生成 makefile 时会用到。
安装 pkg-config
库配置工具,编译x264, x265 时会用到
安装 git
版本控制工具,从版本库下载源码时会用到
如果下载过慢,可添加清华大学开源镜像站的源,参考链接:MSYS2 镜像使用帮助, https://mirrors.tuna.tsinghua.edu.cn/help/msys2/
三. 安装并配置cmake
为了保险起见,这里最好使用独立的cmake 程序来执行后面的编译。
cmake 下载地址:
链接: https://pan.baidu.com/s/1BjR6SY1u0eWihu2AqdpXfA 提取码: mbty
下载完毕后将其解压到任意目录,并在Windows的环境变量中配置cmake 的路径:
四. 编译x264
首先下载x264 源码:
链接: https://pan.baidu.com/s/1R8TdXirYYqah_V_i18z_5Q 提取码: 4gpv
下载完毕后将其解压到 msys 的home 目录下:
回到msys 终端,cd x264当前目录,修改编译工具为 cl ,并将其编译成动态链接库的形式 (若不指定默认则为GCC)
使用 make -j16 命令开始编译
等待编译结束
编译完成后,使用 make install 命令进行安装:
打开 usr\local\lib\pkgconfig\x264.pc, 可以看到该文件已描述了编译完成后的x264的库文件,头文件所在路径,以及库的调用方式。
至此x264 库编译完毕。
五. 编译x265
首先下载x265 源码:
链接: https://pan.baidu.com/s/1yLAk82uDy51dXOufMJe3rA 提取码: qu8q
将下载完成的压缩包解压到 msys的 home 目录下:
x265 源码给出了各个环境下的编译脚本:
PS: 这里注意不要使用 msys2 当中的cmake, 因为msys-cl 目录下生成的make-Makefiles.sh 文件是VS调用的Makefile文件,而不是make的,并且稍候要使用nmake来进行编译。
通过 where cmake 查看当前cmake安装路径
如果发现 msys的 usr/bin目录下已经包含cmake, 则将其改名:
修改完毕后,切换到 x265的编译目录:
执行 ./make-Makefiles.sh 开始编译:
等待编译结束....
然后使用 nmake install 指令进行安装:
可以看到编译完成的x265库被安装到了C盘的Program Files目录下,这里为了使用方便将其拷贝到 msys的 usr/local 路径当中,与之前编译的 x264库保持一致。
找到x265库的安装路径:
选中所有文件,将其拷贝到 msys 的 usr/local 目录下:
由于 x265的 库文件路径已发生变化,所以需要对其路径进行更新:
打开 x265的 pc文件,位于:usr/local/lib/pkgconfig 目录
打开x265.pc 文件,将红框内容
修改成:
这样的话x265就编译完了,并且路径也配置过了。
六. 编译fdk-aac
用于aac格式的编码
首先下载fdk-aac的源码:
链接: https://pan.baidu.com/s/13pff3Jk8-UKwlahdslcvTQ 提取码: ug5c
下载完毕后将其解压到 msys 的 home 目录下:
可以看到,fdk-aac的源码库已经提供了VC编译的Makefile,因此就不需要再借助msys控制台环境来编译了,直接在VS的控制台环境下编译即可,打开VS 的控制台,并且切换到fdk-aac的源码目录:
执行:nmake -f Makefile.vc 开始编译:
编译完毕后,执行:nmake -f Makefile.vc prefix=.\install install 将编译完成的库拷贝到fdk-aac的 install 目录下:
下一步我们将整个编译完成的所有文件全部拷贝到之前用于存放x264,x265的 usr/local 目录下:
这样就添加了fdk-aac的支持,不过有一个问题就是刚才编译生成的fdk-aac 并没有像先前编译x264,x265一样生成pkgconfig:
下面我们手动的为编译好的fdk-aac 库添加 pkgconfig:
回到 fdk-aac的源码目录:home/fdk-aac,
找到 fdk-aac.pc.in 文件,将其拷贝到 刚才添加的 usr/local/lib/pkgconfig 目录下,并重命名为:fdk-aac.pc
打开fdk-aac.pc 文件,仿照 x264.pc, 将其文件内容由:
修改为:
prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Fraunhofer FDK AAC Codec Library Description: AAC codec library Version: Libs: -L${libdir} -lfdk-aac Libs.private: Cflags: -I${includedir}
这样的话我们就生成了一个fdk-aac 的pkgconfig的配置项。aac就全部编译完成了。
七. 编译ffmpeg
这里编译的是ffmpeg4.3 版本, ffmpeg4.3 版本下载:
链接: https://pan.baidu.com/s/19XftM8VX8u_DioyIU7HP-Q 提取码: bzgf
同样,先将解压后的ffmpeg 4.3 目录拷贝到 msys 的home 目录下:
ffmpeg 在 windows 中的编译还是需要用到 msys2, 并且ffmpeg编译要先生成Makefile, 接下来我们为编译作准备,先生成 Makefile
生成Makefile 的代码如下:
CC=cl.exe ./configure --prefix=./install --toolchain=msvc --enable-shared --disable-programs --disable-ffplay --disable-ffmpeg --disable-ffprobe --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265
参数说明:
参数说明:
--prefix=./install 指定输出的目录是在当前目录的install目录下
--toolchain=msvc 指定编译工具链为vs
--enable-shared 编译为动态链接库
--disable-programs 不编译工具
--disable-ffply
--disable-ffmpeg
--disable-ffprobe
--enable-libx264 支持x264
--enable-libx265 支持x265
--enable-gpl 支持h264协议,x264 x265 必备
--enable-libfdk-aac --enable-nonfree 支持aac音频编码 aac 必须包含-enable-nonfree
在msys的控制台窗口中切换到 ffmpeg-4.3目录下,执行上述指令尝试生成Makefile
点回车确认后可能需要一些时间,因为ffmpeg内部有一些测试工具,如果中途出现问题,可以打开ffmpeg的源码目录,找到ffbuild目录中的config.log, 里面详细记录了失败的详细原因。
比如我现在开始执行后,控制台就返回一条错误消息:
提示我libfdk-aac 这个库找不到。我们打开 config.log:
它说找不到fdk-aac/aacenc_lib.h这个头文件。但是我们打开 usr/local/include/fdk-aac 这个目录,发现是有 fdk-aac/aacenc_lib.h 这个头文件的,这是为什么呢?这是因为我们先前在usr/local/lib目录中存放的pkgconfig文件没有被找到,为了让msys能够顺利找到pkgconfig, 我们需要把pkgconfig 剪切到 msys64/mingw32/lib 目录下,因为我们启动的是mingw32的环境,所以它会到这个目录下去找。
如果拷贝到 msys64/mingw32/lib 目录下后,编译仍然找不到libfdk-aac, 可以通过配置 PKG_CONFIG_PATH 环境变量来手动指明libfdk-aac的路径:具体可参考这篇博客:转:PKG_CONFIG_PATH 环境变量配置,比如可以在mingw32 环境下手动导出该环境变量:
root@kali:~# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
如果编译后能找到libfdk-aac, 则我们再次回到msys的控制台窗口,再次执行刚才的指令:
这次又报了libx264没有找到,我们打开ffbuild目录下的 config.log,滑到末尾,发现是:
找不到libx264.lib, 无法执行链接,我们打开先前编译好的libx264的 lib 目录:
注意到没有libx264.lib 这个文件,现在的名字叫 libx264.dll.lib, 我们将 libx264.dll.lib 重命名为 libx264.lib, 再次执行刚才的指令:
修改完毕后再次执行刚才的指令:
这次又提示 ERROR: x265 not found using pkg-config, 我们再打开 config.log:
这次的提示跟上次差不多,也是链接错误,找不到 x265.lib, 我们打开x265 的lib 目录:
将libx265.lib 重命名成 x265.lib:
再次执行刚才的指令:
这次终于可以顺利生成Makefile了。
接下来我们执行 make -j16 开始编译:
编译过程可能有点长,视机器配置而定,我的电脑大约用了3分钟完成编译:
最后我们再执行 make install , 将编译完成的文件安装到 当前目录的install 目录下。install 目录之前已经指定过了。
等待install 结束,打开 ffmpeg 目录下的install 目录:
出现上述的图示就说明 ffmpeg 库已经全部编译完成了。
<完>