x265 是一个免费的软件库和应用程序,用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式,并在 GNU GPL 条款下发布。
FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译,在编译 FFmpeg 之前需要先编译 x265,但并不是所有的版本都能直接使用,比如笔者同时编译 Android、Window 和 Linux 三个平台时,使用 Android NDK r21e 会遇到很多报错,符号缺失,无法编译 .S 文件都是可能遇到的问题。
一、x265 编译
下面的编译统一都使用 ubuntu 18.04 版本进行。编译目录结构如下:
其中 i686 & x86_64 和平台相关,这里是 window 平台示例。 Android 上 arm 平台是 armeabi-v7a & arm64-v8a。x265 目录内放置 x265 的源码。
编译的时候 cd x265 工程 & ./build_x265.sh 即可。然后同级的 build 目录会输出相应的编译产物。
1. 交叉编译 Android 使用的 x265
前置条件使用 android-ndk-r21e linux 版本。编译脚本内容如下:
build_x265.sh
rm -rf $(pwd)/x265/build/android
rm -rf $(pwd)/build
mkdir x265/build/android
cp -rf build_script/* x265/build/android
export NDK_ROOT=/home/snake/Android/android-ndk-r21e # 换成自己的实际 NDK 路径
export ANDROID_API_VERSION=21
export NUMBER_OF_CORES=4
export OUTPUT_PREFIX=$(pwd)/build
pushd x265/build/android/armeabi-v7a
bash build.sh
popd
pushd x265/build/android/arm64-v8a
bash build.sh
popd
build_script/armeabi-v7a/build.sh
cmake ../../../source \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=${ANDROID_API_VERSION} \
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \
-DCMAKE_ANDROID_NDK=${NDK_ROOT} \
-DCMAKE_ANDROID_STL_TYPE=c++_static \
-DNEON_ANDROID=1
sed -i 's/-lpthread/-pthread/g' CMakeFiles/cli.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-shared.dir/link.txt
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-static.dir/link.txt
make -j${NUMBER_OF_CORES}
make DESTDIR=${OUTPUT_PREFIX}/armeabi-v7a install