ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MinGW64安装与FFmpeg 4.4编译实战:从环境配置到构建完成

MinGW64安装与FFmpeg 4.4编译实战:从环境配置到构建完成 新手装环境最怕的就是这种瞬间编译一个开源库卡在第一步明明照着教程点了一路下一步结果打开命令行执行gcc --version直接给我回一句不是内部或外部命令。更气人的是一些旧版MinGW装完之后压根不带make等你折腾半天才发现连FFmpeg的构建脚本都跑不起来一怒之下卸载、重装、再卸载半小时就这么没了。这篇东西就是给你解决MinGW64到底该怎么装、装完怎么验证、怎么拿它编译FFmpeg 4.4这件事的。我按自己踩坑之后总结出来的顺序来写先讲MinGW64选哪个版本、为什么别乱选再给一套完整的安装步骤和PATH配置然后带你把FFmpeg 4.4从头到尾编译一遍最后把那些反复出现的报错和排查办法整理成表。不管你是刚接触C/C工具链的初学者还是被FFmpeg源码搞得头疼的老哥照着操作基本都能顺利跑通。1. 先搞清楚MinGW64到底是啥这一步比安装本身更重要很多教程直接让你去下载一个叫MinGW的旧东西或者随便找一篇十几年前的文章照着弄。我建议你先花两分钟搞清楚这段历史不然装错版本后面全白搭。1.1 MinGW和MinGW-w64是两个项目老牌的MinGW全称Minimalist GNU for Windows只支持32位而且已经很久不更新在64位时代基本属于博物馆藏品。你现在要找的名字一定是MinGW-w64它不是MinGW的某个扩展包而是一个独立的开源项目专门给Windows提供64位和32位的GCC工具链。它包含gcc、g、gdb、make、binutils等一系列编译调试工具FFmpeg 4.4在Windows上编译时绝大多数人用的就是这套环境。我见过不少新人下了一个带mingw字样的压缩包解压后发现bin下面只有gcc.exe和g.exemake.exe不知道去哪了。这是因为MinGW-w64官方在SourceForge上的那个独立工具链包确实侧重编译器核心很多辅助工具要靠你自己补。所以与其下载零散包我后面会更推荐用整合好的发行版与其说是安装MinGW64不如说是在搭建一套完整的Windows GNU编译环境。1.2 重点看全三个关键参数位数、线程模型、异常处理模型很多教程不提这三个参数导致下载的时候一头雾水。我用大白话给你解释位数x86_64就是64位i686就是32位。现在的电脑基本是64位选x86_64就行。线程模型win32和posix两种可选。win32线程模型在Windows上的性能更好但如果你后续要编译用到std::thread、std::mutex这类C标准线程库的代码必须选posix版本。这个堪称最坑选择点没有之一。异常处理模型64位下常见seh和sjlj。seh是64位Windows原生异常处理方式性能好sjlj兼容性更强但性能差一些。新装环境推荐直接选seh。举一个实际例子你在下载页看到x86_64-posix-seh这个名称意思就是64位POSIX线程模型SEH异常处理模型这通常是最稳的组合也是我自己的首选。32位的版本一般选i686-win32-sjlj比较合适但现在基本用不到了。另外还要注意GCC版本号。不要盲目追最新版FFmpeg 4.4这种中等规模的项目对GCC版本没有那么敏感但太老的4.x版本会有编译错误。一般而言8.x、10.x、12.x这些常用版本都实测能过我建议优先选较新的稳定版别选带rc或snapshot字样的测试版。2. MinGW64的三种常见安装方式各有什么坑这里我直接给你对比三种主流方案你可以根据自己情况选。我个人的推荐优先级从高到低是MSYS2 winlibs独立包 TDM-GCC。2.1 方案一MSYS2最推荐想长期编译开源库就选它MSYS2是一个在Windows上提供类Unix环境的软件发行平台说白了就是你装完它之后能在一个类似Linux的终端里用pacman命令装软件包。它本身就带MinGW-w64工具链而且包管理非常方便以后装依赖库比如FFmpeg需要的外部编码器只需要敲命令就行。安装流程去官网下载msys2-x86_64-*.exe安装包注意安装路径不要带中文和空格比如C:\msys64别装到C:\Program Files\下。安装完成后打开终端方式很关键。不要直接双击msys2.exe而是要区分两个入口MSYS2 MSYS这是MSYS环境用的GCC是给MSYS自己用的路径是/usr/bin/gcc不适合编译Windows原生程序。MSYS2 MinGW64这才是我们要的环境GCC是x86_64-w64-mingw32-gcc路径是/mingw64/bin/gcc。ffmpeg编译时如果你在MSYS环境里跑configure经常出现莫名其妙找不到nasm或者yasm的情况切到MinGW64终端里就好了。安装MinGW64工具链pacman -S mingw-w64-x86_64-toolchain这条命令会安装完整的GCC、g、make、gdb等工具。如果需要FFmpeg的常用依赖库还可以顺手装这些pacman -S mingw-w64-x86_64-yasm mingw-w64-x86_64-nasm mingw-w64-x86_64-pkgconf添加环境变量。在MSYS2的MinGW64终端里GCC会在路径里但你如果想让Windows自带的cmd或PowerShell也能直接用gcc需要手动把C:\msys64\mingw64\bin加到系统PATH。具体操作右键此电脑→属性→高级系统设置→环境变量在Path里追加C:\msys64\mingw64\bin然后点击确定保存。MSYS2原理上不是某个固定的MinGW64版本工具链随时可通过pacman -Syu更新。缺点是它默认给的环境变量和系统PATH是隔开的偶尔会让新人困惑为什么终端里能用的gcc在cmd里用不了。2.2 方案二winlibs独立压缩包最轻量适合一次性编译不想装MSYS2这么大个环境的话可以用winlibs.com这个网站提供的MinGW-w64独立发行包。它把编译器、工具、运行库打包好下载解压就能用。关键安装细节选择版本时注意看页面上标记的UCRT和MSVCRT的区别。UCRTUniversal C Runtime是较新Windows系统自带的运行库推荐选UCRTMSVCRT是老字库兼容性最广但新特性少。下载后解压到一个纯英文路径比如D:\mingw64然后把D:\mingw64\bin加到系统PATH里。这个包默认是自带make的不过名字可能叫mingw32-make.exe。为什么叫这个名字因为它兼容Windows风格避免和Unix的make混淆。如果你在命令行里敲make找不到就敲mingw32-make。更稳妥的做法是到bin目录下把mingw32-make.exe复制一份改名为make.exe或者创建个快捷方式我习惯直接改名省得后面每次编译都要多敲几个字母。winlibs的优点是干净、绿色删掉文件夹就是完全卸载。缺点是依赖库都得你手动下载源码、编译、安装如果只编译FFmpeg这一个项目还好后面要搞多个库就不太方便。2.3 方案三TDM-GCC适合只想一键装好不想折腾选择困难症TDM-GCC是一个带安装向导的MinGW-w64发行版界面是全图形化的一路点Next就行。它在国内不少单片机开发教程里出镜率高因为很多人配STM32或VS Code开发环境时图省事。安装时它也会问线程模型注意选posix否则以后写C多线程代码会出问题。TDM-GCC自带make还会自动帮你设置Path所以对纯新手来说确实省心。但我不太推荐用它来编译FFmpeg原因是它的工具链目录结构和标准MinGW-w64略有不同某些开源项目的configure脚本在探测编译器路径时可能读到奇怪的结果。如果已经装了TDM-GCC又想编译FFmpeg不一定非要卸载先在命令行里试gcc --version确认它是能用再往下推进。如果中途出现检测到编译器无法生成可执行文件这类怪问题第一件事就换成winlibs或MSYS2重来别在TDM上死磕。3. 安装后的环境验证与PATH调试这一步做好能省一堆事3.1 验证命令全清单装完不管用的是哪种方式都必须打开一个新的命令行窗口记住是新开的窗口旧窗口不会刷新环境变量执行以下检查gcc --version g --version make --version gdb --version正常情况下gcc和g版本号应该一致make会显示GNU Make的版本信息。如果你看到不是内部或外部命令command not found之类的错误那就直接进入下一步排查。3.2 PATH配置最容易栽的三个跟头第一个跟头是只改用户变量没改系统变量。Windows的Path分用户Path和系统Path有些程序只读系统Path。你最好两个都加或者至少把MinGW64的bin路径加到系统Path里重启电脑之后再看效果。第二个跟头是旧版本残留的编译器截胡。Windows会让系统在Path里从左往右找第一个匹配的gcc.exe。如果你电脑里装过Dev-C、CodeBlocks自带的编译器或者以前装过其他版本的MinGW新装的gcc很可能排在后面命令一执行其实用的是老版本。检查方法是在命令行输入where gcc它会把所有能被找到的gcc路径列出来第一个就是实际生效的。解决办法把想要的路径在Path里移到最上方或者卸载掉残留工具链。第三个跟头是终端编码问题。MinGW工具链在编译时如果源码或输出路径包含中文很容易出现gcc: error: CreateProcess: No such file or directory这类奇怪错误。用英文路径建工程从根子上避免。3.3 写个小程序实测工具链环境变量搞定后写个hello world验证编译链路是否真正畅通#include stdio.h int main(void) { printf(MinGW64 is working!\n); return 0; }保存为test.c在命令行执行gcc test.c -o test.exe ./test.exe能打印出那句话就说明编译链没问题。如果这一步就报错缺头文件说明编译器核心没装好直接回炉看安装步骤。4. 用MinGW64编译FFmpeg 4.4从零到一全流程4.1 为什么要用MinGW64编译FFmpegFFmpeg官方在Windows上的预编译版本不好找就算找到也未必包含libx264等带专利或授权限制的库。自己编译至少有三个好处可以按需裁剪模块可以启用想要的编解码器和滤镜还能用上较新的GCC优化。FFmpeg 4.4发布于2021年虽然版本号不是最新但时至今日它依然是很多开发者眼里的稳定版本网上教程多、排查资料全面。我这里就以4.4为例子做完整演示流程对更新的4.3、5.x甚至6.x版本同样成立。4.2 编译前必须准备的依赖库FFmpeg的configure脚本会检查很多外部库。编译时你想启用哪些功能就得先把对应依赖库的静态库或动态库准备好。这里列几个最常用的yasm/nasm汇编优化必需FFmpeg里很多性能敏感的函数是汇编写的libx264H.264编码libx265H.265/HEVC编码libmp3lameMP3编码libopusOpus音频编码libvpxVP8/VP9编码fdk-aacAAC编码注意它的license一般要自己编译不要一上来就想着把这些全配齐。初次编译建议只配yasm和x264其余后续慢慢加。依赖库的编译方式一般是进到依赖库源码目录依次执行./configure、make、make install这会默认装到/usr/local或/mingw64下。建议用MSYS2的pacman装一批现成的库能省下大把时间。4.3 FFmpeg 4.4源码下载与解压下载FFmpeg 4.4源码wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.gz tar -xzf ffmpeg-4.4.tar.gz cd ffmpeg-4.4如果你在MSYS2里没有wget可以用curl -L -O代替或者直接在浏览器下载后解压。注意源码目录路径不要带中文。4.4 configure参数配置照着抄就行这是全程最容易出问题的一步。下面这份配置是我实测能正常编译的./configure --enable-gpl --enable-libx264 --enable-encoderlibx264 \ --enable-static --disable-shared --extra-cflags-I/mingw64/include \ --extra-ldflags-L/mingw64/lib --prefix/usr/local参数说明很直白--enable-gpl因为libx264使用GPL协议不加这个会报错--enable-libx264启用H.264编码--disable-shared --enable-static生成静态的可执行文件copy单文件就能用--extra-cflags和--extra-ldflags告诉编译器去mingw64目录下找头文件和库文件如果你没装x264就直接去掉--enable-libx264 --enable-encoderlibx264两行改用FFmpeg自带的编码器也能跑通。如果configure卡住先看终端最后几行日志。常见的失败信息有nasm not found回去装nasmpkg-config not found装pkg-config或用--pkg-configpkg-config指定ERROR: libx264 not found说明x264没装好源码路径或库路径有问题4.5 编译命令与过程观察configure通过后执行编译make -j8-j8的8表示并行编译的线程数一般设为CPU核心数的1.5到2倍。我是8核16线程的处理器所以用8这里别贪心设成32内存不够会触发编译进程被杀掉。第一次编译FFmpeg耗时非常长5到15分钟都很正常。中间会刷过去大量CC、AS之类的编译日志。不要因为刷屏心慌只有看到Error才算有问题。编译完成后make install安装到prefix指定的/usr/local目录ffmpeg可执行文件就在这里。4.6 验证编译产物执行ffmpeg -version ffmpeg -encoders | grep 264第一条会显示FFmpeg版本、配置参数、GCC版本等信息第二条如果能看到libx264说明H.264编码器已经成功启用。编译成功的完整标志不是能编译一通就结束而是你配置的编码器全部出现在-encoders列表里。5. 常见报错与排查技巧实录这个表里的每一条都是我或者身边朋友实际撞到过的问题你可以当速查表遇到类似报错直接对号入座。报错特征根本原因快速解决办法gcc is not recognizedPATH配置没生效确认bin路径已加入Path重新打开终端gcc -v显示的版本不是预期版本其他编译器截胡用where gcc看路径顺序调为主用的那个make提示找不到命令独立包没带make或叫mingw32-make把mingw32-make.exe改名或建软链接为make.execonfigure时报找不到nasm/yasm缺汇编器下载nasm或yasm并把对应bin目录加入PATHERROR: libx264 not foundx264库没装或路径没指定编译安装x264确认extra-cflags与extra-ldflags路径正确编译过程中cl.exe相关报错电脑里装有Visual Studio其cl.exe干扰configure临时把MSVC工具链相关目录从PATH中移除CreateProcess: No such file or directory源码路径含中文或空格把源码和工具链换到纯英文路径链接阶段出现undefined reference库的链接参数不全在extra-ldflags后面补库所在路径必要时加-lxxx显式链接编译时杀毒软件报毒误删安全软件把工具链里的exe当病毒添加白名单压缩包重新解压ffmpeg -version执行后提示缺少DLL动态链接的DLL不齐全改用--disable-shared --enable-static重新编译5.1 为什么configure检测不到你明明装好的库这个坑非常经典。FFmpeg的configure脚本找库时依赖的是pkg-config工具去读取.pc文件。很多新人把库编译出来、也make install了但就是检测不到原因往往是PKG_CONFIG_PATH环境变量没设置好。解决方案export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH也可以在configure时直接指定PKG_CONFIG_PATH/mingw64/lib/pkgconfig ./configure ...这一招能解决九成明明装好了却找不到的问题。5.2 编译到一半出现内存不足怎么办并行编译时如果出现cc1.exe: out of memory或者系统卡死八成是-j开太大。先按CtrlC停掉改用make -j2甚至直接make重跑。编译任务是支持断点续跑的上次已经编好的文件不会重新编这个不用担心。5.3 关于32位和64位混编的问题如果你的MinGW64装的是64位工具链那所有依赖库也必须是64位的。一旦混进一个32位的静态库链接阶段会出现一堆莫名其妙的undefined reference查半天都查不到根因。可以用file libxxx.a看一下库的架构类型确保都是x86-64。6. 关于MinGW64和FFmpeg编译的几个私人心得前面说的都是操作层面的事最后聊点我用下来的体会。第一个体会是工具链这东西够用就好不要频繁追求更新。GCC每代版本对C和C标准的支持都在变老项目在一个版本上编译得好好的升到新版本后就冒出一些奇怪的警告甚至错误。网上搜问题答案的时候别人用的GCC版本和你不一样结论也可能完全对不上。锁死一套环境长期使用是效率最高的方案。第二个体会是配置FFmpeg的时候能少enable的库就少enable。很多人看到FFmpeg功能丰富就想一次性全编译结果倒在了各种依赖库的版本兼容性上。我的做法是先只用系统自带编码器编译一个最小可用版本确定能产出ffmpeg.exe了再一个个加上需要的库。增量式扩展每次只改一个变量出问题能立刻锁定凶手。第三个体会是MinGW64编译FFmpeg这个需求的本质不是装一个软件而是学会面对一大套开源工具链。它教你的不只是命令行那点事还有依赖管理、交叉编译、环境隔离、日志排查这些更大一级的技能。今天你搞定了MinGW64和FFmpeg明天遇到别的开源项目要用CMake或者别的构建系统你已经有了足够的底气去接。最后分享一个实用小技巧编译好的ffmpeg.exe如果依赖一堆DLL可以用mingw64/bin下的ldd命令查看它引用了哪些动态库。想把最终产物部署到别的机器上就把它依赖的DLL和exe放到同一个目录下或者干脆静态编译出一个单文件版。我自己的发布习惯就是纯静态编译一个exe拷过去直接跑不污染环境也不怕缺库。希望这篇东西能帮你少走几步弯路。折腾编译环境确实烦但一旦冲过去后面再遇到类似问题你就能很淡定地低下头看日志找出那个真正出错的环节了。
返回列表