Windows10 使用MSYS2和VS2019编译FFmpeg源代码-测试通过

简介: FFmpeg作为一个流媒体的整体解决方案,在很多项目中都使用了它,如果我们也需要使用FFmpeg进行开发,很多时候我们需要将源码编译成动态库或者静态库,然后将库放入到我们的项目中,这样我们就能在我们的项目中使用FFmpeg提供的接口进行开发。关于FFmpeg的介绍这里就不过多说明。

说明

FFmpeg作为一个流媒体的整体解决方案,在很多项目中都使用了它,如果我们也需要使用FFmpeg进行开发,很多时候我们需要将源码编译成动态库或者静态库,然后将库放入到我们的项目中,这样我们就能在我们的项目中使用FFmpeg提供的接口进行开发。关于FFmpeg的介绍这里就不过多说明。

首先想完成的任务时在win10下,从github下编译最新的FFmpeg代码(5.0版本),同时将FFmpeg编译成64位的动态库(同时包含dll和lib)。如果需要编译成64位的静态库,我在后面也会简单的提及下,很简单。

FFmpeg是在linux下使用C语言进行开发的,在linux下编译相对于来说就比较简单,但是window下编译FFmpeg就显得有点麻烦,网上也有很多博客说明如何配置,但是在按照很多博客里的介绍一步一步操作之后,还是遇到了很多错误,或者编译后不版本不符合要求,比如这篇博客里编译的FFmpeg是32位的WINDOWS编译FFMPEG4.3 搭建VS2019开发环境,但是现在很多时候我们需要64位的版本的库,如果我们编译成32位的库,如果我们的应用程序是64位,就会报link错误。,当然本篇博客基本上参考了该篇博客的过程,如果通过我这里的博客无法解决你的问题,可以参考这篇博客。


实验过程

工具

1.vs2019

2,NASM工具(可以通过MSYS2命令下载,不过最好手动安装,防止一些错误方式)

3.MSYS2工具


具体过程

1.安装Visual Studio 2019

如果安装的VS版本低于2019,理应上也是可以的,不过我没有具体测试,小伙伴可以自己尝试

2. 安装NASM工具

2.1去NASM官网下载,如图点击下载win64位的

2a0bbd015c4051756464bf78064c3240_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png2.2 安装NASM


安装步骤就是下一步下一步,没有什么注意的。


3.操作MSYS2工具

3.1去MSYS2官网下载MSYS2工具(我的安装目录为D:\msys)

e178aa345f8c58eb3075b2d1477baaa8_c2e9c66a9fc542969262d0bd49f39f3d.png

安装完后,如下图所示

6047337fc8f66608716585a8b187a726_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

如果对linux熟悉的同学,上图有没有很熟悉,文件结构就是类似linux的文件结构,的确,我们使用msys工具的时候,cd命令跟linux很相像。


3.2 访问windows PATH环境变量

使用任何编辑器打开: D:\msys\msys2_shell.cmd 将 rem set MSYS2_PATH_TYPE=inherit 修改为 set MSYS2_PATH_TYPE=inherit


3.3使用everyting工具搜索vcvarsall.bat(需要安装VS2019)处理工具的具体位置,比如我的位置在:D:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat

f32c562cbbfbe31af3754e477c6d7983_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

在msys2_shell.cmd文件的开始处添加一行内容如下:

51b789e6b195453be21bb1f24ca34ac8_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

3.4 使用VS2019命令行加载MSYS2(使用管理员模式,否则后面有一个步骤会报错,当然忘记了可以重新使用管理员模式重新加载MSYS2)

在开始菜单中打开VS2019文件夹,点击 x64 native tools command…

b4f9de2fb588318cf188e1c6abe30c8f_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_19,color_FFFFFF,t_70,g_se,x_16.png

进入到msys所在目录,以64位方式运行msys2_shell.cmd :

msys2_shell.cmd -mingw64

f1257f8000ef08a676e54198ec31dad9_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

即可顺利启动MSYS2

e6932f514d2ea49cee0540139d468cdc_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

3.5 安装MSYS2编译FFMPEG所需的依赖

依次安装以下工具(安装的过程中可能出错,可能原因是没有安装最新的MSYS2工具,比如会提示key过期等,我在安装的过程中遇到了很多问题,但是忘记记录下来了。这个需要朋友自己去网上查找资料了)

pacman -S nasm #汇编工具
pacman -S yasm #汇编工具
pacman -S make cmake #常规编译工具
pacman -S diffutils  # 比较工具,ffmpeg configure 生成makefile时用到
pacman -S pkg-config # 库配置工具,编译支持x264和x265会用到
pacman -S git  # 从版本库下载源码

3.6 测试

在VS2019命令行输入cmkae,可以正确执行即代表msys2配置成功

ff829ace4018611ab35636f6b31f4a9f_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png


4 安装FFmpeg依赖包

注意:编译的过程比较耗时,需要耐心等待


由于FFmpeg依赖了第三方包,主要是x264,x265,fdc-acc,如果需要这3个库的相关功能,需要先编译这3个库,如果不需要,可以在后面编译的时候说明不需要这3个包即可,在后面会说明


4.1 依赖包和FFmpge源代码准备

d5da8bcfeeaa40ab7581773d1325c676_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_19,color_FFFFFF,t_70,g_se,x_16.png

网盘地址:依赖包和ffmpeg代码,当然如果想获取最新源代码,可以去官网去取。

网盘密码:wv15

当然,这些依赖包在前面提及的依赖包在文章最后。在我网盘也有编译好的64位和提供的32位版本(从前面的博客中提取的)


4.2 创建源码目录和解码源码

创建/home/source目录,用于存放源码 D:\msys\home\source

52178179ada8b2ef5765694b1f6fd450_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

4.3 msys编译X264

–enable-shared:编译成动态库(建议)
–enable-static:编译成静态库
cd /home/source/x264/
CC=cl ./configure --enable-shared  
Make -j4
Make install

20e5665cafac99843a43c27442ae451e_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

e4877ac437168c5eedc72b5ea655a448_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

a8e53b071121ec73767af54e6a5b9021_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_19,color_FFFFFF,t_70,g_se,x_16.png

安装完成后的动态库dll和lib在D:\msys\usr\local中


4.4 使用VS2019命令行编译fdk-acc

cd d:\msys\home\source\fdk-aac-master
nmake -f Makefile.vc
nmake -f Makefile.vc prefix=.\install install

d7f592330d3480d6a2b4d746bf6f66b5_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

由于我已经编译过fdk-acc,所以这里不是我第一次编译的结果,编译后的结果在D:\msys\home\source\fdk-aac-master\install

dedf16b9e4b621cb4ecfb46db8c72276_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png


4.5 使用VS2019的cmake在msys2中编译x265


4.5.1 查询VS2019 cmake路径

Whereis cmake

340ade91a3574e8956eddcb4b8248b66_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

4.5.2编辑文件 D:\msys\home\source\x265\build\msys-cl\make-Makefiles-64bit.sh

03419cf703daf8c5a1f387346af9eac3_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

这个文件要修改2个地方:


第一个地方是将上图的第一出该位x64(这里是VS2019的x64位),这里必须要改,否则vs的cmake编译不过

如下图所示

0671c5ea54a5817e34ef78e92bb0e1cc_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png


第二处是根据cmake的位置将

cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"  ../../source

改为

/d/"Program Files (x86)/Microsoft Visual Studio/2019"/Enterprise/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/cmake.exe -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"  ../../source

注意你的cmake位置

使用msys2 进入目录,执行以下3个命令

cd /home/source/x265/build/msys-cl/
./make-Makefiles-64bit.sh
Nmake install

3e1640fc87cf2c427e870b1f039a81bb_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

执行nmake install 如果出现权限错误(前文已经提到,是没有管理员权限所致,注意这里的图片不是我自己的图片,是其他博客的)

899d3870e086f792bcaed19e1ccc4265_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_15,color_FFFFFF,t_70,g_se,x_16.png

9b5e4f7251eff482cc6ba608cefa91cc_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_19,color_FFFFFF,t_70,g_se,x_16.png


执行namake install之后可见x265被编译至 C:/Program Files (x86)/x265/目录

我们需要将其复制至msys2的 /usr/local/目录


4.6 准备编译好的文件


4.6.1 拷贝x265文件

将4.5步里得到C:\Program Files (x86)\x265文件里面的bin、include、lib拷贝到msys的/usr/local目录中


4.6.2 拷贝fdk-aac文件

将4.4步骤生成的fdk-aac相关的库和头文件(D:\msys\home\source\fdk-aac-master\install)拷贝到msys的/usr/local目录中


将 D:\msys\home\source\fdk-aac-master\fdk-aac.pc.in 复制至 D:\msys\usr\local\lib\pkgconfig 并重命名为 fdk-aac.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}

4.6.3 修改lib和文件内容

进入目录 D:\msys\usr\local\lib,将 libx264.dll.lib 重命名为 libx264.lib


4.6.3 检查文件和修改文件名(重要步骤,否则后面很容易报错,请仔细检查,我可能已经将有的库和文件名已经修改了,希望你们和我当前的目录文件和名称一致!)

(1)文件结构

1c84cb9028343ba826b36fa758f252f5_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

e91d6830e188df9a2ad52f9f7657f0c1_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

2795c54839825d6ce3947cbeb8d83ff2_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png


fdk-aac.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}

x264.pc内容

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: 0.159.2991M
Libs: -L${exec_prefix}/lib -llibx264 
Libs.private: 
Cflags: -I${prefix}/include -DX264_API_IMPORTS

x265.pc内容

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: x265
Description: H.265/HEVC video encoder
Version: 0.0
Libs: -L${libdir} -llibx265
Libs.private: 
Cflags: -I${includedir}

将D:\msys\usr\local\lib\pkgconfig 的上面3个文件复制至 D:\msys\mingw64\lib ,如下图所示

3abc835f6ac490426fdc7f9854e861c4_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

具体是拷贝到lib文件下,还是里面有一个pkconfig目录,我也不是很确定,如果你们也不确定,可以按我这样做,由于时间原因,我没有在测试一次了。


5 编译ffmpeg

5.1 进入到ffmpeg目录

cd /home/source/FFmpeg-master/

如果遇到报错,学会看日志,如下

4f5e833bd806911103d4c020a01e7677_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

5.2 使用VS2019编译器配置FFMPEG

时间比较长,需要有耐心

CC=cl.exe ./configure --prefix=./install --toolchain=msvc --arch=x64 --enable-shared --disable-programs --disable-ffplay --disable-ffmpeg --disable-ffprobe --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265

其中想要什么模块就–enable, 不需要就disable,如果发现像我上图的错误,看看日志一般就可以知道是什么问题。

596ce4c2ad34ec894e67f3c782f0d7c6_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWJjZDU1MjE5MTg2OA==,size_20,color_FFFFFF,t_70,g_se,x_16.png

5.3 编译FFMPEG

时间很长,慢慢等着吧。。。。。。。。

Make -j4

5.4 安装FFMPEG

Make install

6.验证

请参考我的参考文档,这里就不细说了。


总结

总体来说,在windows下编译FFmpeg是不方便的,但是黄天不负有心人,只要你愿意花时间去琢磨,相信自己总会解决的。

编译出现问题,需要冷静去的查询资料和看编译的日志输入.

如果在编译的过程中,出现什么问题,给我留言。

PS:如果觉得本文帮助了你,希望能帮我点一个小小的赞,您的支持是我最大的动力!


相关文章
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Dept实体类
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Dept实体类
8 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Dao层
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Dao层
10 0
|
1月前
|
Unix 编译器 开发者
Qt5.14.2 轻松掌握Qt中的压缩与解压缩:QuaZIP的神秘面纱与实战演练之windows环境编译
Qt5.14.2 轻松掌握Qt中的压缩与解压缩:QuaZIP的神秘面纱与实战演练之windows环境编译
|
24天前
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(二)
12 0
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——测试
8 0
|
1月前
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Emp实体类
javaWeb服务详解【客户端调用】(含源代码,测试通过,注释) ——Emp实体类
7 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
7 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext.xml
6 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层
vjavaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层
5 0
|
1月前
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
8 0