Qt5.8 集成 FFmpeg 开发库:从编译到运行避坑指南

发布时间:2026/10/17 2:52:18
Qt5.8 集成 FFmpeg 开发库:从编译到运行避坑指南 简介本资源面向在 Qt5.8 框架下进行音视频开发的 C 工程师与多媒体方向学习者提供一套可直接集成的 FFmpeg 开发库文件解决 Qt 项目调用 FFmpeg 时头文件、导入库与运行时动态库缺失的问题。压缩包共 186 个文件约 40.9MB包含 116 个 h 头文件、23 个 c 示例源码、16 个 dll 动态库以及 def、a、lib 等链接文件与少量 exe、txt、readme、makefile覆盖编解码、封装格式、滤镜与重采样等核心组件。已有 400 人学习下载。借助其中的头文件与静态库读者可在 .pro 中配置 INCLUDEPATH 与 LIBS 完成工程链接dll 目录保证程序运行时正确加载transcode_aac.c、transcoding.c 等示例则展示了从媒体读取、解码到转码输出的完整流程便于快速搭建子线程处理与 QProcess 调用方案是 Qt 结合 FFmpeg 做播放、编辑与格式转换的实用起点。1. Qt5.8 配 FFmpeg 开发库为什么你编译过了却跑不起来装 Qt5.8 加 FFmpeg 这套组合最坑的地方不在于编译而在于「编译过了但一运行就崩」。我见过太多人把 FFmpeg 的 dev 包往系统里一装Qt 的.pro里随手写个-lavcodec编译阶段一切正常结果程序启动直接报error while loading shared libraries或者更隐蔽的——解码到一半花屏、内存泄漏查半天才发现是运行时的库版本和编译时对不上。Qt5.8 是 2017 年初的版本默认走 MinGW 5.3 或 MSVC2015而 FFmpeg 官方给 Windows 的预编译包是按 MSVC 运行时构建的MinGW 链接 MSVC 的.lib本身就是玄学现场。这套环境适合两类人一类是要在 Qt 里做播放器、转码工具、视频编辑的开发者另一类是接手了老项目、发现LIBS -lavformat却不知道当年怎么配起来的人。下面按「选版本 → 装库 → 配工程 → 验证 → 排错」的顺序走一遍每一步都给出可复现的命令和参数取舍。2. 版本选型与目录规划Qt5.8 到底该配哪个 FFmpeg2.1 编译器决定 FFmpeg 构建版本不是反过来Qt5.8 在 Windows 上常见的两套工具链是MinGW 5.3.0 32-bit和MSVC2015 32-bit/64-bit。FFmpeg 官方ffmpeg.org/download.html提供的 Windows 预编译包来自 gyan.dev 或 BtbN 的构建默认是 MSVC 运行时。如果你用 MinGW 的 Qt直接链 MSVC 的.lib会在链接期报undefined reference to __imp__...或者更诡异的file format not recognized。我一般会这样选Qt5.8 MSVC2015直接用 FFmpeg 官方 shared 包.lib是导入库.dll放运行时目录最省事。Qt5.8 MinGW 5.3要么自己用 MinGW 重新编译 FFmpeg耗时但干净要么用-Wl,--enable-auto-import配合.dll.a转换但后者在 FFmpeg 这种导出符号极多的库上容易翻车。版本号上FFmpeg 4.x 系列对 Qt5.8 是安全的因为 4.x 的 API 在libavcodec里还保留了avcodec_decode_video2这类老接口虽然标记 deprecated。如果你上 FFmpeg 5.x 或 6.xavcodec_decode_video2被彻底移除Qt5.8 项目里那些老解码代码会直接编译失败。所以我的建议是Qt5.8 配 FFmpeg 4.4.x 的 shared 构建这是兼容性和维护性的平衡点。2.2 目录结构先定好后面少改十次.pro不要用「下载完解压到桌面用的时候再找」这种打法。我习惯在项目根目录外建一个统一的第三方库目录比如D:/dev/thirdparty/ffmpeg-4.4.1里面分三个子目录ffmpeg-4.4.1/ ├── bin/ # 放 avcodec-58.dll、avformat-58.dll 等运行时 ├── include/ # 放 libavcodec/、libavformat/ 等头文件目录 └── lib/ # 放 avcodec.lib、avformat.lib 等导入库这样在 Qt 的.pro里只需要写一个FFMPEG_ROOT变量后面所有路径都从它派生。如果你把 dll 和 lib 混在一起部署时windeployqt不会自动帮你拷 FFmpeg 的 dll你得手动挑混在一起就容易漏。提示FFmpeg 的 shared 包解压后通常有bin、include、lib三个目录但有些构建会把lib里的.lib和.dll都塞在bin拿到包先ls一眼别假设目录名。2.3 环境变量只加bin不加lib很多人习惯把 FFmpeg 的bin加到系统PATH这没问题方便命令行调ffmpeg.exe。但不要把lib目录加到LIB环境变量因为 Qt 的 qmake 有自己的库搜索路径逻辑系统LIB会干扰 MSVC 链接器对运行时库的选择。我一般只在 Qt 的.pro里用绝对路径指定LIBS不依赖系统环境变量。这样换机器、换 Qt Kit 的时候行为是一致的。3. 安装 FFmpeg 开发库从下载到验证头文件可用3.1 下载与解压认准 shared 包别下 staticFFmpeg 官方不直接提供 Windows 二进制但 gyan.dev 和 BtbN 的构建是社区公认的。下载时选ffmpeg-4.4.1-full_build-shared.7z这类名字里带shared的包。static包会把所有库静态链进ffmpeg.exe不给你.lib和.dllQt 项目用不了。解压用 7-Zip 或tarWindows 10 以上自带tar可以解.7z吗不行.7z还是得用 7-Zip。解压后按 2.2 的目录结构整理好。整理完先验证头文件在不在# 在 FFMPEG_ROOT 下执行确认关键头文件存在 ls include/libavcodec/avcodec.h ls include/libavformat/avformat.h ls include/libavutil/avutil.h ls lib/avcodec.lib ls bin/avcodec-58.dll如果avcodec.h不在说明你下的是dev包但没包含完整头文件或者解压层级多了一层。常见做法是解压后进到最内层目录把include、lib、bin三个目录整体移出来。3.2 用dumpbin确认.lib的架构和导出符号MSVC 工具链里有个dumpbin在「VS2015 开发者命令提示符」里可用。这一步是很多教程跳过的但它是避免「链接过了运行崩」的关键# 查看 avcodec.lib 是 32 位还是 64 位 dumpbin /headers D:/dev/thirdparty/ffmpeg-4.4.1/lib/avcodec.lib | findstr machine # 输出示例 # 8664 machine (x64) - 64 位 # 14C machine (x86) - 32 位你的 Qt Kit 是 32 位.lib就必须是14C machine (x86)。如果这里对不上后面所有链接错误都是白费功夫。另一个命令是看导出符号dumpbin /exports D:/dev/thirdparty/ffmpeg-4.4.1/lib/avcodec.lib | findstr avcodec_decode_video2如果这个符号在说明你拿的是 FFmpeg 4.x 的库老代码能编。如果不在你拿的是 5.x 以上得改代码。3.3 把运行时 dll 放到 Qt 能找的地方编译期用.lib运行期用.dll。Qt Creator 里直接按 F5 运行时工作目录通常是构建目录比如build-项目名-Desktop_Qt_5_8_0_MSVC2015_32bit-Debug/debug。你有两个选择把 FFmpeg 的bin目录加到系统PATH重启 Qt Creator 生效。在.pro里加QMAKE_POST_LINK把 dll 拷到输出目录。我一般用第二种因为不污染系统环境换机器也不会忘# 在 .pro 文件里追加注意 Windows 路径用 / 或 \\ FFMPEG_ROOT D:/dev/thirdparty/ffmpeg-4.4.1 # 编译后自动拷贝运行时 dll 到输出目录 QMAKE_POST_LINK $$quote(cmd /c copy /y $$FFMPEG_ROOT/bin/*.dll $$OUT_PWD/debug/)这段的逻辑是QMAKE_POST_LINK在链接完成后执行$$OUT_PWD是 qmake 的输出目录变量/y是覆盖不提示。注意debug子目录名要和你的构建配置匹配Release 构建时改成release。如果你用 shadow build$$OUT_PWD指向的就是构建目录不是源码目录。4. 在 Qt5.8 工程里配置 FFmpeg.pro参数逐个拆4.1INCLUDEPATH和LIBS的写法与顺序一个能跑通的.pro配置大概长这样# FFmpeg 根目录按实际路径改 FFMPEG_ROOT D:/dev/thirdparty/ffmpeg-4.4.1 # 头文件搜索路径 INCLUDEPATH $$FFMPEG_ROOT/include # 导入库路径 LIBS -L$$FFMPEG_ROOT/lib # 按依赖顺序链接avformat 依赖 avcodecavcodec 依赖 avutil LIBS -lavformat -lavcodec -lavutil # 如果用到 swscale图像缩放和 swresample音频重采样再加 LIBS -lswscale -lswresample这里的关键是链接顺序。MSVC 的链接器对静态库顺序敏感avformat里调用了avcodec的符号所以-lavformat必须写在-lavcodec前面。写反了会报unresolved external symbol而且报的符号名看起来像是avcodec的容易误导你去查avcodec的配置其实是顺序问题。-L指定库目录-l指定库名不带.lib后缀。Qt 的 qmake 在 Windows 上会把-lavformat翻译成avformat.lib在 MinGW 下翻译成libavformat.a或avformat.dll.a。所以同一份.pro在 MSVC 和 MinGW 下都能用前提是你的库目录里确实有对应格式的文件。4.2 用pkg-config还是手写路径Qt5.8 下我选后者FFmpeg 在 Linux 下习惯用pkg-config --libs libavformat拿编译参数但 Windows 的 Qt5.8 环境里pkg-config不是标配而且 FFmpeg 的 Windows 构建通常不带.pc文件。所以别折腾pkg-config直接手写INCLUDEPATH和LIBS更可控。如果你确实想用pkg-config得先装 MSYS2 的pkg-config再把 FFmpeg 的.pc文件路径加到PKG_CONFIG_PATH然后在.pro里用CONFIG link_pkgconfig和PKGCONFIG libavformat。但这条链路里任何一环版本不对报错信息都很难懂。我一般对新手直接推荐手写路径出问题好排查。4.3 一个最小可编译的main.cpp验证配置.pro配好后别急着写业务代码先用一个最小程序验证头文件和库都能用// main.cpp #include QCoreApplication #include QDebug // FFmpeg 头文件用 extern C 包住否则 C 名字修饰会导致链接失败 extern C { #include libavcodec/avcodec.h #include libavformat/avformat.h #include libavutil/avutil.h } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 打印 FFmpeg 版本确认链接的是预期版本 qDebug() avcodec version: avcodec_version(); qDebug() avformat version: avformat_version(); qDebug() avutil version: avutil_version(); // 调用一个实际函数确认符号能解析 av_register_all(); // FFmpeg 4.x 里仍可用5.x 已移除 qDebug() FFmpeg init ok; return 0; }extern C是必须的因为 FFmpeg 是 C 库C 编译器默认会做名字修饰name mangling不加extern C链接时会找不到符号。av_register_all()在 FFmpeg 4.x 里是注册所有编解码器和格式的函数5.x 之后被废弃所以这行代码也顺便帮你确认了版本。如果编译通过、运行输出FFmpeg init ok说明环境通了。5. 避坑与排查五个让 Qt5.8 FFmpeg 翻车的经典场景5.1 现象编译报cannot open file avcodec.lib原因LIBS -L$$FFMPEG_ROOT/lib的路径不对或者FFMPEG_ROOT变量没生效。qmake 的变量展开是文本替换如果路径里有空格或反斜杠可能被截断。解决在.pro里加一行message($$FFMPEG_ROOT)qmake 执行时会在「概要」面板输出实际值。确认路径存在后用正斜杠/而不是反斜杠\。如果路径有空格用$$quote()包住。5.2 现象链接报unresolved external symbol __imp__avcodec_...原因这是 MSVC 链接 MinGW 编译的库或者 32 位 Qt 链了 64 位库的典型症状。__imp__前缀说明链接器在找导入库的符号但.lib里的符号格式不匹配。解决用 3.2 的dumpbin /headers确认.lib架构和 Qt Kit 的架构对齐。如果 Qt 是 32 位FFmpeg 也必须是 32 位。别想着「64 位库能兼容 32 位程序」MSVC 下不行。5.3 现象程序启动报error while loading shared libraries: avcodec-58.dll原因运行时找不到 dll。编译期链接的是.lib但.dll不在PATH或程序目录里。解决用 3.3 的QMAKE_POST_LINK把 dll 拷到输出目录或者把 FFmpeg 的bin加到系统PATH后重启 Qt Creator。注意 Qt Creator 有自己的环境变量缓存改完PATH不重启不生效。5.4 现象解码时花屏、绿屏但编译链接都正常原因FFmpeg 的 dll 版本和.lib版本不一致。比如.lib是 4.4.1但PATH里有个旧版 3.x 的avcodec-57.dll被优先加载了。解决用QMAKE_POST_LINK强制拷贝你指定的那套 dll 到输出目录并且在程序启动时用qDebug() avcodec_version()打印实际加载的版本号。如果版本号和你预期的不一样说明加载了别的 dll。Windows 下可以用 Process Explorer 看进程加载的 dll 路径。5.5 现象av_register_all()编译报undefined reference原因你下的 FFmpeg 是 5.x 或 6.x这个函数已经被移除。Qt5.8 项目里的老代码如果依赖它就会编译失败。解决要么换回 FFmpeg 4.4.x要么把av_register_all()删掉5.x 之后不需要手动注册但删掉后可能还有其他 API 不兼容。最稳的做法是锁定 FFmpeg 4.4.x别追新。6. 装完怎么验证三个层次确认环境真的通了第一层是编译期验证。用 4.3 的最小main.cpp在 Qt Creator 里按 Build看「编译输出」面板有没有error。如果只有warning关于av_register_all被 deprecated那是正常的FFmpeg 4.x 会提示但不会报错。第二层是运行期验证。按 F5 运行看「应用程序输出」面板有没有打印出三个版本号。avcodec_version()返回的是一个整数比如3818084你可以用av_version_info()拿到字符串形式的版本更直观qDebug() FFmpeg version string: av_version_info(); // 输出示例FFmpeg version string: 4.4.1如果这里打印的版本和你下载的不一致说明运行时加载了别的 dll回到 5.4 排查。第三层是功能验证。写一个最小的打开视频文件的代码确认avformat_open_input能返回 0AVFormatContext *fmtCtx nullptr; int ret avformat_open_input(fmtCtx, test.mp4, nullptr, nullptr); if (ret 0) { char errBuf[AV_ERROR_MAX_STRING_SIZE] {0}; av_strerror(ret, errBuf, sizeof(errBuf)); qDebug() open input failed: errBuf; } else { qDebug() open input ok, duration: fmtCtx-duration; avformat_close_input(fmtCtx); }av_strerror把错误码转成可读字符串比直接看负数有用得多。如果这一步返回open input ok说明 FFmpeg 的 demuxer 能正常工作环境彻底通了。我自己的习惯是每次在新机器上配完 Qt5.8 FFmpeg都会把这三层验证跑一遍尤其是第三层。因为前两层只能证明「库能链上」第三层才能证明「库能干活」。从那以后我每次配环境都强制走一遍avformat_open_input哪怕项目暂时用不到 demuxer也先跑通再说。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询