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的)。

WINDOWS 下编译 ffmpeg 源码总结相关推荐

  1. windows下编译lua源码

    http://blog.csdn.net/zjg555543/article/details/11814563 因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 l ...

  2. windows下编译pcl-master源码(带GPU)

    参考博客 1.http://pointclouds.org/documentation/tutorials/compiling_pcl_windows.php#compiling-pcl-window ...

  3. Windows IEDA 编译Hbase源码报错 - 无法执行shell脚本

    windows 下编译 hbase源码,报错 [ERROR] Command execution failed. java.io.IOException: Cannot run program &qu ...

  4. Win7下编译mosquitto源码

    在windows下编译mosquitto源码使用的工具包括: 1.visual studio 2010(用vs .net 2003的编译器时cmake会提示未识别的c或c++编译器) 2.cmake ...

  5. 在Windows下编译FFmpeg详细说明

    在Windows下编译FFmpeg详细说明 MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 Mi ...

  6. 从零开始,手把手教你如何在Ubuntu下编译VLC-Android源码

    前言 公司项目中使用的libvlcjni.so库文件,有点老,对Android 6.0+系统兼容性太差了,当程序运行在Android6.0+系统上时,回弹出警告框,提示libvlcjni.so:tex ...

  7. win7下编译python源码

    win7下编译python源码 下载源码: 打开网页:https://www.python.org/downloads/release/python-2710/ 下载完成后解压即可 查看文档: 其实最 ...

  8. 在CentOS下编译VLC源码

    在CentOS下编译VLC源码 一.下载VLC源码 二.VLC编译与安装 1.编译与安装 2.库文件 3.头文件 三.报错解决 1.configure: error: Could not find l ...

  9. 【FFMPEG系列】之windows下编译FFMPEG篇----之三(MingW64)

    目录结构 序 1 .安装mingw64 1.1 mingw64的安装 1.2 msys的安装 2.编译ffmpeg 2.1 编译 序 前文"windows下编译FFMPEG篇----之一(M ...

最新文章

  1. Linux/ubuntu 服务器开启6010端口-X11服务-ssh连接
  2. python 加注拼音-一个将汉字转换成汉语拼音的python库的代码
  3. jdbc oracle存储过程,java jdbc 执行oracle存储过程
  4. apache mod_xsendfile提高php文件下载速度的方法
  5. 专利计算机存储介质是智力活动,涉及计算机程序的发明专利申请的相关问题PPT课件.pptx...
  6. bzoj 3528: [Zjoi2014]星系调查
  7. android 之日期选择器,Android GUI 之日期选择器(DatePicker)
  8. SQL Server 检测到基于一致性的逻辑 I/O 错误
  9. ListView分页显示
  10. mac的鼠标滚动方向和触摸板方向,一个插件搞定
  11. 计算机主机频率单位,计算机常见计量单位解析
  12. 服装制造业信息化系统分析(一)
  13. 谈谈毕业之后的第一份工作的感悟
  14. Oracle数据库中,deprecate和desupport的区别,以及Oracle 12.2中的deprecate 的参数
  15. flowchart流程图编程语言下载_flowchart.net
  16. 欢迎光临 Javen-Studio 新网址:http://javenstudio.org
  17. redit mysql_如何搭建自己的网站?
  18. C语言习题:猜数字游戏(C语言随机数)
  19. 微信小程序分享生成海报
  20. 问题解决: ValueError: Can't Handle mix of binary and continuous

热门文章

  1. 数字化运营新基建搭建地铁管理系统,提升城市轨道交通发展
  2. 如何才能成为一名医生?
  3. 【逆向创新】关于AI+医疗,我们要听医生说
  4. Injective Protocol官方文档翻译(八) -头寸、仓位(Positions)
  5. 双缝干涉数据折线平滑1.0
  6. div水平垂直居中 div相对于父元素水平垂直居中 div相对于网页水平垂直居中
  7. 用python测试网速脚本
  8. base operand of '-' has non-pointer type 'const Comple
  9. STM32F103RC引脚模拟I2C操作EEPROM(24C16)的方法总结
  10. Java 的日历类Calendar