上一篇说了怎么交叉编译x264和ffmpeg,并将x264编译进ffmpeg中,这一篇咱们来交叉编译一下fdk-acc并弄进ffmpeg中。
系统环境 ubuntu 22.04
NDK版本 r21e
fdk-aac版本 2.0.2
一、交叉编译fdk-aac
首先,先下载fdk-aac源码,笔者这里下载的是最新的2.0.2版本,下载地址:opencore-amr download | SourceForge.net
下载完成后,解压到指定目录中。
随后安装一下需要的工具。
sudo apt-get install autoconf
这里笔者仅安装了一个,如果编译过程中提示还有其他工具缺失,也安装一下。
准备工作做好了,接下来开始撸编译脚本。
创建aac_build_android.sh,并输入内容如下:
#!/bin/bash
export NDK=/home/selivert/ndk/android-ndk-r21e #NDK path
export NDK_TOOLCHAIN_DIR=/home/syq/android-toolchain/
export PATH=$PATH:$TOOLCHAIN/bin/
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
./autogen.sh
PREFIX=`pwd`/android/armeabi-v7a
CONFIGURE_FLAGS="--prefix=$PREFIX --enable-example --with-aix-soname=-arm"
export TARGET=armv7a-linux-androideabi21
export CC=$TOOLCHAIN/bin/$TARGET-clang
export CXX=$TOOLCHAIN/bin/$TARGET-clang++
#armeabi-v7a
./configure $CONFIGURE_FLAGS --host=arm-linux-androideabi --with-sysroot=$SYSROOT
make clean
make -j8
make install
PREFIX=`pwd`/android/arm64-v8a
CONFIGURE_FLAGS="--prefix=$PREFIX --enable-example --with-aix-soname=-arm"
export TARGET=aarch64-linux-android21
export CC=$TOOLCHAIN/bin/$TARGET-clang
export CXX=$TOOLCHAIN/bin/$TARGET-clang++
# arm64-v8a
./configure $CONFIGURE_FLAGS --host=arm-linux-androideabi --with-sysroot=$SYSROOT
make clean
make -j8
make install
脚本写的比较丑陋,能用就行。有精通脚本语言的大佬可以自行优化一发。
执行脚本,开始编译。
本以为可以一路畅通无阻,但是编译报错了。
这是编译环境的问题,网上查到的资料说是这个fdk-aac的源码开发环境是Android,所以里面有用到Android日志系统代码,好在用得不多,只要注释掉就OK。
知道了错误原因,这下就好办了,直接打开报错文件,注释掉头文件引用代码和日志输出代码(好在不是很多,只有两三处需要注释),然后保存,继续编译。
编译成功。
二、将fdk-aac编进ffmpeg
fdk-aac添加到ffmpeg步骤与x264的基本一致,都是开启相关支持,并声明库与头文件所在位置。
这里直接贴有变化的命令。
...
build() {
APP_ABI=$1
CFLAG264=-I/home/selivert/x264/android/$APP_ABI/include
LDFLAG264=-L/home/selivert/x264/android/$APP_ABI/lib
CFLAGAAC=-I/home/selivert/fdk-aac-2.0.2/android/$APP_ABI/include #修改点
LDFLAGAAC=-L/home/selivert/fdk-aac-2.0.2/android/$APP_ABI/lib #修改点
...
./configure ${CONFIGURATION} \
--pkg-config="pkg-config --static" \
--extra-cflags="$EXTRA_CFLAGS$CFLAG264 $CFLAGAAC" \ #修改点
--extra-ldflags="$EXTRA_LDFLAGS$LDFLAG264 $LDFLAGAAC" #修改点
echo "-------- > Start make $APP_ABI with -j1"
make -j1
echo "-------- > Start install $APP_ABI"
make install
echo "++++++++ > make and install $APP_ABI complete."
}
build_all() {
#配置开源协议声明
COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"
COMMON_OPTIONS="$COMMON_OPTIONS --enable-nonfree"
...
COMMON_OPTIONS="$COMMON_OPTIONS --enable-libx264"
COMMON_OPTIONS="$COMMON_OPTIONS --enable-libfdk-aac" #修改点
COMMON_OPTIONS="$COMMON_OPTIONS --enable-encoder=libfdk_aac" #修改点
#COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"
COMMON_OPTIONS="$COMMON_OPTIONS --enable-encoder=libx264"
...
然后开始编译,坐等编译结束。
三、验证
编完之后咱们验证一下fdk-aac编码器到底有没有编进ffmpeg
这里说明一下,如果使用的是so库,在android程序内不仅需要替换刚编好的ffmpeg,还需要添加刚编好的fdk-aac的so库,否则程序会因为找不到fdk-aac的库而直接崩溃。
上结果(此处仅显示了名称中包含“26”或者“aa”的编码器)