ffmpeg 64位静态库编译

ffmpeg 64位静态库编译

最近在用vs2017编译webrtc,发现webrtc官方不让用msvc编译器编译里面的ffmpeg,但是又需要用到ffmpeg,于是单独编译了ffmpeg,编译的是ffmpeg的动态库版本,然后在webrtc里面链接库和头文件。
而最终在demo的成果物里面,需要包含了avcodec-59.dll,avdevice-59.dll,avfilter-8.dll等ffmpeg的动态库,demo才能运行,而如果编译出ffmpeg的静态库,则webrtc的demo里面就不需要这些动态库,发布相关的安装包时,安装包能小不少。
关于webrtc的编译,可以参考我的如下链接:
https://blog.csdn.net/tusong86/article/details/120554374

ffmpeg的动态库编译其实是简单的,主要是因为ffmpeg对外提供的是标准的c接口,所以在windows平台,mingw编译出的动态库,无论是vs2008,还是vs2015,还是vs2019,都是可以正常链接的。但是如果编译的是ffmpeg的静态库版本,由于静态库的本质跟动态库不一样,静态库的本质,其实跟linux的.o文件,windows的obj文件是一样的,vs2015编译的静态库,vs2017可能就没法用,故编译时,采取vs2017编译器编译ffmpeg。
ffmpeg在windows下提供的编译环境是mingw.

一、安装MinGW-w64
打开网址:https://sourceforge.net/projects/mingw-w64/files/,选择下载如下:
在这里插入图片描述

这是个在线安装工具,本人安装到的是c盘,如下是安装成功后的截图。
在这里插入图片描述
双击进入到文件夹mingw64里面,如下所示:
在这里插入图片描述
注意到上面红色方框的文件夹msys,这是个工具集文件夹,里面会有bash,grep等命令的程序文件,在安装mingw64的时候,是没有的,这里是我下载好后放进去的,此外后续编译ffmpeg之前,还需要先用gcc编译yasm,为此需要将mingw64下面的bin目录加入到path路径下,如下图所示:
在这里插入图片描述
然后我们说说msys的下载。

二、下载msys
打开如下网址:
https://sourceforge.net/projects/mingw-w64/files/External%20binary%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/
选择如下红色方框的zip文件。
在这里插入图片描述
下载后,我们将MSYS-20111123.zip解压缩,并放置于mingw-64的安装目录下,用户可以通过上面的图片找到具体放置位置.

三 编译安装yasm
yasm是个汇编器,在编译ffmpeg的时候,需要用到,为此,先要在mingw的环境下,编译安装yasm.
首先下载yasm,这个比较容易,下载地址如下:
https://www.linuxfromscratch.org/blfs/view/svn/general/yasm.html
下载下来的文件名是yasm-1.3.0.tar.gz,放于e盘的ffmpeg目录下,然后解压缩,如下所示:
在这里插入图片描述
现在开始编译安装yasm,首先打开mingw环境,如下所示:
在这里插入图片描述
双击msys.bat,打开mingw环境,切换到yasm的编译目录在这里插入图片描述
然后再依次执行
./configure --prefix=/usr/local/yasm
make
make install
命令执行完后,可以在对应的目录下找到yasm的成果物,如下:
在这里插入图片描述
四 ffmpeg编译
我们需要的是ffmpeg静态库,故跟编译器关联,由于我们最终是要在vs2017中用,为此ffmpeg也需要用vs2017的编译器进行编译,其实mingw的编译器也能编译出静态库,但是加入到vs2017工程时,会有一些链接错误.

首先:关闭掉刚才打开的mingw终端,然后修改启动文件msys.bat,在文件的起始位置,加入这句调用.
在这里插入图片描述
这句调用结束后,ffmpeg的编译就变成了64位的vs2017编译器进行编译,否则则是gcc编译器编译.

然后进入到ffmpeg的编译目录,e:\ffmpeg\ffmpeg
依次执行下面命令
export PATH=$PATH:/usr/local/yasm/bin
./configure --arch=x86_64 --disable-debug --prefix=./vs2017_build_static --toolchain=msvc
make

在编译的时候,会有报错,如下所示:

在这里插入图片描述
注释掉相应的代码就行,如下图所示:
在这里插入图片描述
还有一个需要注释的是文件ffprobe.c,如下所示:
在这里插入图片描述
这两个地方注释掉后,ffmpeg就能编译过去了.

然后执行make install,
成果物就进入到目录vs2017_build_static,如下图所示:
在这里插入图片描述
这些后缀为a的文件就是编译出的静态库,我在最终项目用它们的时候,习惯改成windows的命名习惯,比如将libavcodec.a改成avcodec.lib.

而最终在项目中用时,会报一堆的链接错误.加上对应的库即可,此处我列举下我加入的库.
#pragma comment(lib, “avcodec.lib”)
#pragma comment(lib, “avformat.lib”)
#pragma comment(lib, “avutil.lib”)
#pragma comment(lib, “avdevice.lib”)
#pragma comment(lib, “avfilter.lib”)
#pragma comment(lib, “swresample.lib”)
#pragma comment(lib, “swscale.lib”)

#pragma comment(lib, “Mfuuid.lib”)
#pragma comment(lib, “Strmiids.lib”)
#pragma comment(lib, “Mfplat.lib”)
#pragma comment(lib, “Bcrypt.lib”)
#pragma comment(lib, “Secur32.lib”)
#pragma comment(lib, “ws2_32.lib”)
#pragma comment(lib, “Vfw32.lib”)
#pragma comment(lib, “Shlwapi.lib”)

注意:如果ffmpeg是以mingw自带的gcc编译器进行编译,则编译出的静态库,放到demo中时,会有如下的链接错误:

1>avcodec.lib(tiff.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(ratecontrol.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(cbs.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(pamenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(pnmenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(xbmenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(xsubenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(mf_utils.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(encode.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(ffv1enc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf

一看就是运行时库缺失,并且是mingw的运行时库,所以后面采取的是vs2017编译器进行编译。

Guess you like

Origin blog.csdn.net/tusong86/article/details/120804189