WINDOWS 下编译 ffmpeg 源码,有两种方式:VC、GCC
VC 编译:
https://github.com/ShiftMediaProject/FFVS-Project-Generator.git
优点:省时省力。动态库、静态库、X86、X64都支持。
缺点:
A. 需要 VC 运行库的支持。作者也不打算脱离 VC 运行库。
B. 不支持 CUDA
C. 没有 GCC 编译出来的 FFMPEG 效率高。
我将一个H265 视频,转换为 H264,GCC 编译的 FFMPEG.EXE 是 VC 编译的 FFMPEG.EXE 的 4 倍多。
作者也说有可能是 GCC 有 VC 不支持的语法,造成的。
看来要想效果好,只有用 MSYS2 编译了。
GCC 编译: 一:自己动手,丰衣足食
WINDOWS 下 GCC 编译当然用 MSYS2 。因为用 MSYS2 编译 FFMPEG 比较容易。如果不需要第三方库的支持:
./configure
或者
./configure --enable-gpl --enable-version3 --enable-nonfree
或者 (静态库编译)
./configure --enable-gpl --enable-version3 --enable-nonfree --disable-shared --enable-static
或者 (动态库编译)
./configure --enable-gpl --enable-version3 --enable-nonfree --disable-static --enable-shared
这样就可以了。默认是编译的是动态库。
因为有开源协议的规定,有的开源源码只能被编译成动态库。
所以你经常看到某些开源代码的动态库,但没有静态库,就是这个原因。
我们自己动手编译,动态库、静态库随自己意。
FFMPEG 本身也没有严格遵守源码协议。
一步一步添加第三方库的支持。
MSYS2 可以安装很多第三方库,也不用自己编译了,省了很多时间。
比如在 MSYS2 中安装 openh264 库(openh264 就有协议要求,只能被编译成动态库):
pacman -S --noconfirm mingw-w64-i686-openh264 mingw-w64-x86_64-openh264
前一个是 X86 位的,后一个是 X64 位的。
逐步添加第三方库的支持
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-amf
......
这是 WINDOWS 下 FFMPEG 支持的所有第三方库
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-amf --enable-bzlib --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-ffnvcodec --enable-nvdec --enable-cuda-llvm --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libdav1d --disable-debug --enable-fontconfig --enable-libass --enable-libbluray --enable-libfreetype --enable-libmfx --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libwavpack --enable-libwebp --enable-libxml2 --enable-libzimg --enable-libshine --enable-avisynth --enable-libxvid --enable-libaom --enable-libopenmpt --enable-chromaprint --enable-decklink --enable-frei0r --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libfdk-aac --enable-libflite --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libkvazaar --enable-libmodplug --enable-librtmp --enable-librubberband --enable-libssh --enable-libtesseract --enable-libxavs --enable-libzmq --enable-libzvbi --enable-openal --enable-libcodec2 --enable-libsrt --enable-ladspa --enable-opencl --enable-opengl --enable-libopenh264 --enable-openssl
优点:自己编译,按自己定制。
缺点:费时费力,劳心劳神。
二:跨平台编译
https://github.com/rdp/ffmpeg-windows-build-helpers.git
这是在 linux 下编译,得到 WINDOWS 下的 FFMPEG。
两种方式:
一种是安装 linux 虚拟机,如:Ubuntu,在 Ubuntu 中用 GCC 编译。
一种是在 windows10 中,linux 子系统中,用 GCC 编译。
优点:省力,自动下载,自动编译,动态库、静态库、X86、X64都支持;
缺点:耗时。要下载东东太多,比较耗时。好的翻墙工具必不可少。否则网络就能折腾死你;
三:自动编译
https://github.com/m-ab-s/media-autobuild_suite.git
用的也是 MSYS2(GCC) 编译。参考的也是上面的跨平台编译。
自动下载所有工具(包括MSYS2)、源码、编译一步到位。
优点:省力,自动下载,自动编译,动态库、静态库、X86、X64都支持;
缺点:耗时。要下载东东太多,比较耗时。好的翻墙工具必不可少。否则网络就能折腾死你;
无论哪一种编译,中间文件都在40G以上。大硬盘必不可少。固态硬盘最好。
msys2(GCC) 静态编译时,因为 msys2 优先会查询 .dll.a 文件,如果存在,会进行动态链接。
所以如果有静态库的情况下,可以将 .dll.a 文件删除或重命名为 .dll.a.bak。
让 msys2 找不到动态库,只能用静态库链接了(mingw64\lib 目录和 mingw32\lib 目录)。
libgcc_s_dw2-1.dll、libgomp-1.dll 等 GCC 系统的 dll ,可以将
mingw32\lib\gcc\i686-w64-mingw32\9.2.0
和
mingw64\lib\gcc\x86_64-w64-mingw32\9.2.0
目录下的 .dll.a 重命名为 .dll.a.bak,就可以了。
libwinpthread-1.dll.a 在 目录 mingw64\x86_64-w64-mingw32\lib 下(x64),和 mingw32\i686-w64-mingw32\lib 下(x86)。(前提你编译的静态库中,不能调用了这些 GCC 系统 Dll 中的函数,必须是静态调用)
推荐用第三种方式编译。解决了网络问题,就没有什么问题了。
编译一次2-3个小时。动态库、静态库、X86、X64一起编译,那就要10个小时了。
————————————————
版权声明:本文为CSDN博主「dbyoung」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dbyoung/article/details/100030912