ARTICLE DETAIL

资讯详情

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

QT使用FFMpeg编译安卓程序.md

QT使用FFMpeg编译安卓程序.md 一、准备工作下载所需资源资源版本/说明下载地址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 → 重新构建。
返回列表