首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
QT使用FFMpeg编译安卓程序.md
📅 2026/9/30 15:13:06
✍️ 爱科研究院
👁 阅读 3,247
一、准备工作下载所需资源资源版本/说明下载地址FFmpeg 源码7.1.5与 Qt 6.11 内置版本一致https://ffmpeg.org/releases/ffmpeg-7.1.5.tar.gzAndroid NDKWindows 版r26b (26.1.10909125) 或 r26d (26.3.11579264)https://developer.android.com/ndk/downloadsMSYS2提供 Windows 下的类 Unix 编译环境https://www.msys2.org/⚠️关键点NDK 必须下载Windows 版android-ndk-r26d-windows.zip不能使用 Linux 版。这只下载了FFmpeg 7.1.5源码和MSYS2,Android NDK使用QT自带的,目录位于/e/Android/android-sdk/ndk/27.2.12479018二、配置 MSYS2 编译环境安装 MSYS2 后打开MSYS2 MINGW64终端不是普通 MSYS2 终端。安装编译依赖pacman-S--noconfirmmakeyasm diffutils设置环境变量根据实际路径修改exportPATH/e/Qt/Tools/mingw1310_64/bin:$PATHexportANDROID_NDK_ROOT/e/Android/android-sdk/ndk/27.2.12479018三、在 Windows 下编译 FFmpeg for Android解压 FFmpeg 源码到不含中文和空格的路径例如/e/ffmpeg/ffmpeg-7.1.5/ffmpeg-7.1.5。在源码目录下创建build_android.sh#!/bin/bash# 设置目标架构这里以 arm64-v8a 为例ARCHaarch64CPUarmv8-aTOOLCHAIN_ARCHaarch64-linux-android# NDK 工具链路径TOOLCHAIN$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/windows-x86_64# 最低支持的 Android API 级别建议与你的 Qt 项目一致API28# 进入源码目录cd/e/ffmpeg/ffmpeg-7.1.5/ffmpeg-7.1.5# 配置 FFmpeg./configure\--prefix./install-android/$ARCH\--target-osandroid\--arch$ARCH\--cpu$CPU\--enable-cross-compile\--cross-prefix$TOOLCHAIN/bin/llvm-\--cc$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--cxx$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--sysroot$TOOLCHAIN/sysroot\--enable-shared\--disable-static\--disable-doc\--disable-programs\--enable-network# 开始编译-j 后面的数字建议设为 CPU 核心数make-j8makeinstall其他编译方式3.1 build_x86.sh#!/bin/bash# # FFmpeg for Android - x86# set-eexportANDROID_NDK_ROOT/e/Android/android-sdk/ndk/27.2.12479018API28ABI_NAMEx86ARCHx86CPUi686TOOLCHAIN_ARCHi686-linux-androidcase$(uname-s)inMINGW*|MSYS*|CYGWIN*)HOST_TAGwindows-x86_64;;Linux*)HOST_TAGlinux-x86_64;;*)echo不支持的主机平台;exit1;;esacTOOLCHAIN$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOST_TAGSYSROOT$TOOLCHAIN/sysrootSOURCE_DIR$(pwd)PREFIX$SOURCE_DIR/android/$ABI_NAMEechoecho 编译 FFmpeg for$ABI_NAMEechocd$SOURCE_DIRrm-rf$PREFIXmakedistclean2/dev/null||true./configure\--prefix$PREFIX\--target-osandroid\--arch$ARCH\--cpu$CPU\--enable-cross-compile\--cross-prefix$TOOLCHAIN/bin/llvm-\--cc$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--cxx$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--ar$TOOLCHAIN/bin/llvm-ar\--nm$TOOLCHAIN/bin/llvm-nm\--strip$TOOLCHAIN/bin/llvm-strip\--ranlib$TOOLCHAIN/bin/llvm-ranlib\--sysroot$SYSROOT\--enable-shared\--disable-static\--disable-doc\--disable-programs\--enable-network\--enable-jni\--enable-mediacodec\--disable-asmmake-j$(nproc2/dev/null||echo8)makeinstallechoecho?$ABI_NAME编译完成$PREFIXls-la$PREFIX/lib3.2 build_arm64_v8a.sh#!/bin/bash# # FFmpeg for Android - arm64-v8a# set-e# ---------- 配置 ----------exportANDROID_NDK_ROOT/e/Android/android-sdk/ndk/27.2.12479018API28ABI_NAMEarm64-v8aARCHaarch64CPUarmv8-aTOOLCHAIN_ARCHaarch64-linux-android# 判断主机平台case$(uname-s)inMINGW*|MSYS*|CYGWIN*)HOST_TAGwindows-x86_64;;Linux*)HOST_TAGlinux-x86_64;;*)echo不支持的主机平台;exit1;;esacTOOLCHAIN$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOST_TAGSYSROOT$TOOLCHAIN/sysrootSOURCE_DIR$(pwd)PREFIX$SOURCE_DIR/android/$ABI_NAMEechoecho 编译 FFmpeg for$ABI_NAMEechoechoNDK:$ANDROID_NDK_ROOTechoAPI:$APIecho输出:$PREFIXecho# ---------- 清理 ----------cd$SOURCE_DIRrm-rf$PREFIXmakedistclean2/dev/null||true# ---------- 配置 ----------./configure\--prefix$PREFIX\--target-osandroid\--arch$ARCH\--cpu$CPU\--enable-cross-compile\--cross-prefix$TOOLCHAIN/bin/llvm-\--cc$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--cxx$TOOLCHAIN/bin/${TOOLCHAIN_ARCH}${API}-clang\--ar$TOOLCHAIN/bin/llvm-ar\--nm$TOOLCHAIN/bin/llvm-nm\--strip$TOOLCHAIN/bin/llvm-strip\--ranlib$TOOLCHAIN/bin/llvm-ranlib\--sysroot$SYSROOT\--enable-shared\--disable-static\--disable-doc\--disable-programs\--enable-network\--enable-jni\--enable-mediacodec# ---------- 编译 ----------make-j$(nproc2/dev/null||echo8)makeinstallechoecho?$ABI_NAME编译完成$PREFIXls-la$PREFIX/lib赋予执行权限并运行# 4. 首次使用前赋权chmodx build_*.sh# 5. 编译 arm64-v8a./build_arm64_v8a.sh# 6. 编译其他架构可选./build_armv7.sh ./build_x86.sh ./build_x86_64.sh编译成功后库文件位于./android/aarch64/。NDK r26 注意--cross-prefix必须为llvm-编译器名格式为aarch64-linux-android28-clang。显式指定--android-api可避免 “Defaulting to target API 21” 警告。四、复制库文件到 Qt 项目将编译生成的include和lib目录复制到 Qt 项目下textD:\Desktop\WifiUAV_MY\WifiUAV_MY\libs\android\arm64-v8a\ ├── include\ │ ├── libavcodec\ │ ├── libavformat\ │ ├── libavutil\ │ └── libswscale\ └── lib\ ├── libavcodec.so ├── libavcodec.so.61 ├── libavformat.so ├── libavformat.so.61 ├── libavutil.so ├── libavutil.so.59 ├── libswscale.so └── libswscale.so.8重要.so和.so.xx软链接指向的实际文件都要复制缺一不可五、修改.pro文件不要使用 $$ANDROID_ABI它在 qmake 解析阶段为空直接硬编码arm64-v8a增加自行匹配# 2. 区分平台配置android{FFMPEG_DIR$$PWD/libs/android# 根据目标 ABI 选择对应的 FFmpeg 库contains(ANDROID_TARGET_ARCH, arm64-v8a){FFMPEG_ANDROID_DIR$$FFMPEG_DIR/arm64-v8a}contains(ANDROID_TARGET_ARCH, armeabi-v7a){FFMPEG_ANDROID_DIR$$FFMPEG_DIR/armeabi-v7a}contains(ANDROID_TARGET_ARCH, x86){FFMPEG_ANDROID_DIR$$FFMPEG_DIR/x86}contains(ANDROID_TARGET_ARCH, x86_64){FFMPEG_ANDROID_DIR$$FFMPEG_DIR/x86_64}# 兜底如果没匹配到默认用 arm64isEmpty(FFMPEG_ANDROID_DIR){FFMPEG_ANDROID_DIR$$FFMPEG_DIR/arm64-v8a message(Warning: Unknown ABI, fallback to arm64-v8a)}INCLUDEPATH$$FFMPEG_ANDROID_DIR/include LIBS-L$$FFMPEG_ANDROID_DIR/lib\-lavcodec-lavformat-lavutil-lswscale}else:win32{# Windows 平台使用项目内置的 Windows FFmpegFFMPEG_DIR$$PWD/lib/ffmpeg INCLUDEPATH$$FFMPEG_DIR/include LIBS-L$$FFMPEG_DIR/lib\-lavcodec\-lavformat\-lavutil\-lswscale}else:unix{# Linux/Ubuntu 平台使用系统 FFmpeg 开发包CONFIGlink_pkgconfig PKGCONFIGlibavcodec libavformat libavutil libswscale}修改后执行清理项目 → 执行 qmake → 重新构建。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/30 15:13:06
EPLAN实战指南:从模板配置、线号生成到部件库管理
2026/9/30 15:08:06
PyTorch Geometric实战指南:从Data构造到GNN训练部署
2026/9/30 15:08:06
新闻文本分类实战:BERT与朴素贝叶斯双模型对比与融合
2026/9/30 15:58:22
备份容灾解决方案是什么?从数据备份到业务容灾的完整梳理
2026/9/30 15:58:22
支付协议地图:x402、AP2、MPP、ACP四类协议的本质与选型逻辑
2026/9/30 15:58:22
AutoGen多智能体系统:构建可落地的AI协作操作系统
2026/9/30 15:58:22
水稻病害识别落地难点:光照、混病与边缘部署实战
2026/9/30 15:58:22
基于Flask+微信小程序的高校活动报名与素拓分管理系统
2026/9/30 15:53:18
模型优化器实战:量化、剪枝、蒸馏与算子融合加速推理
2026/9/30 0:04:47
扩散模型发展史:从物理热力学到Stable Diffusion的生成式AI进化
2026/9/30 0:04:47
模型优化全链路实践:从训练到部署的优化策略与排障经验
2026/9/30 0:04:47
DeepSeek Agent训练场拆解:沙箱隔离、任务编排与防作弊实战
2026/9/29 11:29:08
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
2026/9/29 13:01:36
新手入门看这篇:建设网站加盟避坑指南与SEO实操
2026/9/29 14:07:33
论文AIGC疑似度是什么意思?想查论文AI率有哪些免费工具?