适用于 ARM (aarch64)、Windows (mingw)、Android、Raspberry Pi 等平台的交叉编译。
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
sudo apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip
unzip android-ndk-r25b-linux.zip
export NDK=/path/to/android-ndk-r25b
wget https://ffmpeg.org/releases/ffmpeg-7.1.tar.gz
tar -xf ffmpeg-7.1.tar.gz
cd ffmpeg-7.1
./configure \
--arch=aarch64 \
--target-os=linux \
--cross-prefix=aarch64-linux-gnu- \
--enable-cross-compile \
--prefix=/usr/local/ffmpeg-aarch64 \
--enable-shared \
--disable-static \
--enable-gpl \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-nonfree
./configure \
--arch=x86_64 \
--target-os=mingw64 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-cross-compile \
--prefix=/usr/local/ffmpeg-mingw \
--enable-shared \
--disable-static \
--enable-gpl \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-nonfree
./configure \
--target-os=android \
--arch=arm64 \
--cc=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang \
--cxx=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++ \
--cross-prefix=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android- \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--prefix=/usr/local/ffmpeg-android \
--enable-shared \
--disable-static \
--enable-gpl \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-nonfree
make -j$(nproc) && sudo make install
编译完成后,二进制文件会安装到 --prefix
指定的目录(如 /usr/local/ffmpeg-aarch64
)。
file /usr/local/ffmpeg-aarch64/bin/ffmpeg
输出示例:
ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped
file /usr/local/ffmpeg-mingw/bin/ffmpeg.exe
输出示例:
PE32+ executable (console) x86-64, for MS Windows
file /usr/local/ffmpeg-android/lib/libavcodec.so
输出示例:
ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped
./configure \
--enable-small \ # 最小化体积
--disable-doc \ # 不编译文档
--disable-ffplay \ # 不编译 ffplay
--disable-ffprobe \ # 不编译 ffprobe
--extra-cflags="-O3 -mcpu=cortex-a72" # ARM 优化
./configure \
--enable-static \
--disable-shared \
--extra-ldflags="-static"
平台 | 工具链 | --target-os |
--cross-prefix |
---|---|---|---|
ARM (aarch64) | gcc-aarch64-linux-gnu |
linux |
aarch64-linux-gnu- |
Windows (x86_64) | mingw-w64 |
mingw64 |
x86_64-w64-mingw32- |
Android (arm64) | NDK clang |
android |
aarch64-linux-android- |
✅ 适用于嵌入式设备、跨平台开发、性能优化场景
现在你可以把编译好的 FFmpeg 部署到目标设备了!
在 Android 开发中,arm64
和 arm64-v8a
本质上是相同的架构,但术语的使用场景和规范性略有差异。以下是详细解释:
arm64
是 ARM 64 位架构的通用简称,指代基于 ARMv8-A 及更高版本的 64 位处理器架构(如 Cortex-A53/A72/A76 等)。
arm64-v8a
是 Android 官方定义的 ABI(应用二进制接口)名称,明确指定了基于 ARMv8-A 的基础指令集。
arm64-v8a
(如 libs/arm64-v8a
)。对比项 | arm64 |
arm64-v8a |
---|---|---|
定义方 | ARM 公司通用术语 | Android 官方 ABI 名称 |
使用场景 | 通用技术文档、命令行参数 | Android NDK/Gradle 配置 |
指令集范围 | 泛指 ARMv8-A 及以上 | 明确限定为 ARMv8-A 基础特性 |
实际兼容性 | 等同于 arm64-v8a |
等同于 arm64 |
--arch=arm64
配置和 Android Studio 的 arm64-v8a
ABI 目录,实际编译结果完全一致。--arch=arm64
(通用术语)。arm64-v8a
(如 NDK 的 APP_ABI
或 Gradle 的 abiFilters
)。arm64-v9a
?arm64-v9a
ABI。arm64-v8a
ABI,即使硬件支持 ARMv9 特性(如 SVE2)。ABI 目录名 | 架构 | 说明 |
---|---|---|
armeabi-v7a |
ARMv7-A | 32 位 ARM(已逐步淘汰) |
arm64-v8a |
ARMv8-A | 64 位 ARM(当前主流) |
x86_64 |
x86-64 | 64 位 Intel/AMD(模拟器常用) |
编译 FFmpeg 时:
--arch=arm64
,无需改为 arm64-v8a
(FFmpeg 内部已适配)。aarch64-linux-android-
)。Android 项目中:
build.gradle
中指定 ABI: gradle
android {
defaultConfig {
ndk { abiFilters 'arm64-v8a' }
}
}
src/main/jniLibs/arm64-v8a/
。arm64
是技术术语,arm64-v8a
是 Android 的标准化 ABI 名称,两者在 Android 环境下无实际区别。arm64
,Android 工程配置用 arm64-v8a
。