WINDOWS 下编译 ffmpeg 源码总结

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个小时了。
睡一觉,早晨起床就编译好了。岂不妙哉。
 

你可能感兴趣的:(Windows,ffmpeg,编译,源码)