WINDOWS 下编译 ffmpeg 源码总结

18 篇文章 0 订阅
7 篇文章 1 订阅

WINDOWS 下编译 ffmpeg 源码,有两种方式:VC、GCC

1、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 编译了。

2、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) 编译。参考的也是上面的跨平台编译。它是在 WINDOWS 平台下编译。
     自动下载所有工具(包括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个小时了。
睡一觉,早晨起床就编译好了。岂不妙哉。

3、VC + GCC 混合编译:
上面的 GCC 编译已经很不错了,为什么要执着用 VC 编译呢?
因为有 VSIDE 集成开发环境,修改调试非常方便。宇宙人都知道。
FFMPEG 是支持 VC 编译的。加参数 --toolchain=msvc 就可以了(具体如何整,自行搜索)。
关键是第三方库的编译。FFMPEG 又支持众多的第三方库。
因为 FFMPEG 是用 GCC 来检查依赖关系、第三方库支持的,所以 MSYS2(GCC) 是必须的。
我们要用 VC 来编译 FFMPEG ,所以在 MSYS2 中第三方库就不编译了,直接安装就好了(没有的,才编译)。
因为实际上我们也不会使用 GCC 里面的库,只是 FFMPEG 检查依赖时会用到。
现在,如果需要在 FFMPEG 中,启用某个第三方库,首先在 MSYS2 中安装好这个库。然后在用 VC 编译这个库。
两个都弄好之后,就可以在 FFMPEG 编译中,启用这个第三方库,并且使用 VC 编译。
编译检查用 GCC 中的第三方库的头文件、库文件,
实际编译源码、连接用的是 VC 编译好的第三方库的头文件、库文件。交叉混合编译了。
这里有个细节要注意,路径问题。头文件、库文件搜索路径。
编译检查用的是 GCC,必须指向 MSYS2 目录;这个是默认的,不用设置。
编译源码、连接用的是 VC 的,必须指向你编译好的第三方库的目录。
你自己用 VC 编译的第三方库,头文件、库文件最好统一放在一个目录下。
将 MSYS2 中,LIB 目录下的 pkgconfig 目录复制到你的 VC 第三方库的 LIB 目录下。
你必须在编译参数中,添加搜索头文件、库文件的目录参数(VC的)。
 

 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值