FFmpeg开发:在Linux上交叉编译Android平台的x265库
准备工作
环境要求
- Linux系统(推荐Ubuntu 20.04+)
- Android NDK(推荐r21+)
- CMake 3.18+
- Git
- 必要的构建工具(make, autoconf等)
安装依赖
sudo apt update
sudo apt install -y build-essential autoconf automake libtool pkg-config \
cmake git ninja-build curl unzip
下载Android NDK
# 下载NDK r25b(当前稳定版本)
wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip
unzip android-ndk-r25b-linux.zip -d ~/android-ndk
# 设置环境变量
export ANDROID_NDK_HOME=~/android-ndk/android-ndk-r25b
export PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin
交叉编译x265库
1. 克隆x265源码
git clone https://bitbucket.org/multicoreware/x265_git.git
cd x265_git
git checkout Release_3.5 # 使用稳定版本
2. 创建交叉编译工具链文件
创建 android_toolchain.cmake
:
# android_toolchain.cmake
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21) # Minimum API level
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) # 可根据需要修改为 armeabi-v7a 或 x86_64
set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME})
set(CMAKE_ANDROID_STL_TYPE c++_shared) # 使用共享C++运行时库
# 设置编译器
set(CMAKE_C_COMPILER aarch64-linux-android21-clang)
set(CMAKE_CXX_COMPILER aarch64-linux-android21-clang)
3. 配置和编译x265
# 创建构建目录
mkdir build_android && cd build_android
# 配置CMake
cmake -DCMAKE_TOOLCHAIN_FILE=../android_toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_SHARED=ON \
-DENABLE_ASSEMBLY=ON \
-DENABLE_CLI=OFF \
-DCMAKE_INSTALL_PREFIX=./install \
../source
# 编译并安装
make -j$(nproc)
make install
多架构支持脚本
创建构建脚本 build_x265_android.sh
#!/bin/bash
# 支持的架构列表
ARCHS=("arm64-v8a" "armeabi-v7a" "x86_64" "x86")
# 清理旧构建
rm -rf build_android
for ARCH in "${ARCHS[@]}"; do
echo "Building for $ARCH..."
# 设置架构相关变量
case $ARCH in
"arm64-v8a")
COMPILER_PREFIX="aarch64-linux-android"
API=21
CMAKE_ARCH="arm64-v8a"
;;
"armeabi-v7a")
COMPILER_PREFIX="armv7a-linux-androideabi"
API=21
CMAKE_ARCH="armeabi-v7a"
;;
"x86_64")
COMPILER_PREFIX="x86_64-linux-android"
API=21
CMAKE_ARCH="x86_64"
;;
"x86")
COMPILER_PREFIX="i686-linux-android"
API=21
CMAKE_ARCH="x86"
;;
esac
# 创建构建目录
BUILD_DIR="build_android/$ARCH"
mkdir -p $BUILD_DIR && cd $BUILD_DIR
# 配置CMake
cmake \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=$CMAKE_ARCH \
-DANDROID_PLATFORM=android-$API \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_SHARED=ON \
-DENABLE_ASSEMBLY=ON \
-DENABLE_CLI=OFF \
-DCMAKE_INSTALL_PREFIX=./install \
../../source
# 编译并安装
make -j$(nproc)
make install
# 返回项目根目录
cd ../..
done
echo "All architectures built successfully!"
集成x265到FFmpeg
1. 编译FFmpeg支持x265
# 克隆FFmpeg源码
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
# 配置FFmpeg
./configure \
--prefix=./android_build \
--enable-cross-compile \
--cross-prefix=aarch64-linux-android- \
--target-os=android \
--arch=aarch64 \
--sysroot=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--extra-cflags="-I$HOME/x265_git/build_android/arm64-v8a/install/include" \
--extra-ldflags="-L$HOME/x265_git/build_android/arm64-v8a/install/lib" \
--enable-gpl \
--enable-libx265 \
--enable-shared \
--disable-static
# 编译并安装
make -j$(nproc)
make install
2. 创建Android FFmpeg构建脚本 build_ffmpeg_android.sh
#!/bin/bash
# 配置参数
FFMPEG_DIR="FFmpeg"
X265_DIR="$HOME/x265_git/build_android"
ANDROID_NDK="$ANDROID_NDK_HOME"
API_LEVEL=21
ARCHS=("arm64-v8a" "armeabi-v7a" "x86_64" "x86")
# 清理旧构建
cd $FFMPEG_DIR
make clean
rm -rf android_build
# 为每个架构构建
for ARCH in "${ARCHS[@]}"; do
echo "Building FFmpeg for $ARCH..."
# 设置架构相关变量
case $ARCH in
"arm64-v8a")
TARGET_ARCH="aarch64"
CPU="armv8-a"
CROSS_PREFIX="aarch64-linux-android"
;;
"armeabi-v7a")
TARGET_ARCH="arm"
CPU="armv7-a"
CROSS_PREFIX="arm-linux-androideabi"
;;
"x86_64")
TARGET_ARCH="x86_64"
CPU="x86_64"
CROSS_PREFIX="x86_64-linux-android"
;;
"x86")
TARGET_ARCH="x86"
CPU="i686"
CROSS_PREFIX="i686-linux-android"
;;
esac
# 配置FFmpeg
./configure \
--prefix=./android_build/$ARCH \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX- \
--target-os=android \
--arch=$TARGET_ARCH \
--cpu=$CPU \
--sysroot=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--extra-cflags="-I$X265_DIR/$ARCH/install/include -march=$CPU -mfpu=neon -mfloat-abi=softfp" \
--extra-ldflags="-L$X265_DIR/$ARCH/install/lib" \
--enable-gpl \
--enable-libx265 \
--enable-shared \
--disable-static \
--disable-doc \
--disable-programs
# 编译并安装
make -j$(nproc)
make install
# 清理中间文件
make clean
done
echo "FFmpeg for Android with x265 support built successfully!"
验证构建结果
检查x265库
# 列出生成的库文件
find x265_git/build_android -name "libx265*.so"
# 检查ABI兼容性
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf \
-h x265_git/build_android/arm64-v8a/lib/libx265.so
检查FFmpeg是否包含x265支持
# 查看FFmpeg配置信息
./android_build/arm64-v8a/bin/ffmpeg -version
# 检查编码器列表
./android_build/arm64-v8a/bin/ffmpeg -encoders | grep libx265
常见问题解决
1. 汇编优化失败
错误信息:
nasm/yasm not found or too old. Use --disable-asm for a crippled build.
解决方案:
# 安装nasm
sudo apt install nasm
# 重新配置时添加汇编支持
cmake ... -DENABLE_ASSEMBLY=ON ...
2. C++标准库链接错误
错误信息:
undefined reference to `std::__ndk1::...'
解决方案:
确保FFmpeg和x265使用相同的C++运行时:
# 在FFmpeg配置中添加
--extra-ldflags="-L$X265_DIR/$ARCH/install/lib -lc++_shared"
3. API级别不兼容
错误信息:
error: undefined reference to 'some_function@API_LEVEL'
解决方案:
统一API级别:
# 在CMake配置中
-DANDROID_PLATFORM=android-24
# 在FFmpeg配置中
--sysroot=$ANDROID_NDK/platforms/android-24/arch-arm64
4. NEON优化问题
错误信息:
NEON intrinsics not supported
解决方案:
# 在CMake配置中添加
-DENABLE_NEON=ON
# 在FFmpeg配置中添加
--extra-cflags="-march=armv8-a -mfpu=neon -mfloat-abi=softfp"
优化建议
-
启用汇编优化:
-DENABLE_ASSEMBLY=ON -DENABLE_ALTIVEC=ON -DENABLE_AVX2=ON
-
调整性能参数:
-DMAIN12=ON -DHIGH_BIT_DEPTH=ON -DEXPORT_C_API=ON
-
减小库体积:
# 在FFmpeg配置中 --enable-small --disable-avdevice --disable-swresample
-
使用Ninja加速构建:
cmake -G Ninja ... ninja -j$(nproc)
-
预编译工具链缓存:
ccache -M 5G export CMAKE_C_COMPILER_LAUNCHER=ccache export CMAKE_CXX_COMPILER_LAUNCHER=ccache
通过以上步骤,您可以在Linux系统上成功交叉编译支持x265的Android FFmpeg库。构建完成后,将生成的.so文件和FFmpeg可执行文件集成到Android项目中即可使用高性能的HEVC编码功能。