Android使用fdk-aac编码pcm为aac(上篇)

171 阅读1分钟

总结一下编译fdk-aac库遇到的坑

编译系统环境:ubuntu 20.04.6

编译前安装的依赖:

sudo apt install git make autoconf automake libtool -y

务必要安装以上依赖,否则会出现编译不过的情况

下载源码

github.com/mstorsjo/fd…

执行指令 autoconf -i

进入源码文件夹,想通过configure配置文件执行,但发现没有;这是因为需要先执行一个文件才行 ./autogen.sh

执行该文件就需要上面的依赖,否则该文件执行不成功

执行完上面的文件之后,文件夹里面就有configure配置文件了

添加log.h文件

不然编译会报错

可以在源码根目录创建一个src目录文件夹,然后里面存放log.h文件

#ifndef EXAMPLE_LOG_H
#define EXAMPLE_LOG_H


#include <stdarg.h>
#include <android/log.h>

#ifdef __cplusplus
extern "C" {
#endif


void android_errorWriteLog(int32_t errCode, const char* format, ...)
{
    va_list args;
    va_start(args, format);
    __android_log_vprint(ANDROID_LOG_ERROR, "Error", format, args);
    va_end(args);
}


#ifdef __cplusplus
}
#endif

#endif //EXAMPLE_LOG_H


创建编译脚本

set -e

NDK=/home/xbin/Android/Sdk/ndk/28.2.13676358   # <<< 修改成你的 NDK 路径
API=21                         # 最低 API Level

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot

ARCH=$1
if [ "$ARCH" != "arm64-v8a" ] && [ "$ARCH" != "armeabi-v7a" ]; then
    echo "用法: $0 {arm64-v8a|armeabi-v7a}"
    exit 1
fi

if [ "$ARCH" = "arm64-v8a" ]; then
    HOST=aarch64-linux-android
    CC=$TOOLCHAIN/bin/${HOST}${API}-clang
    CXX=$TOOLCHAIN/bin/${HOST}${API}-clang++
elif [ "$ARCH" = "armeabi-v7a" ]; then
    HOST=arm-linux-androideabi
    CC=$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang
    CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang++
fi

OUT_DIR=$(pwd)/out/$ARCH
mkdir -p $OUT_DIR

echo ">>> 编译 fdk-aac for $ARCH ..."
./configure \
  --host=$HOST \
  --enable-shared \
  --disable-static \
  --disable-dependency-tracking \
  --prefix=$OUT_DIR \
  CC="$CC --sysroot=$SYSROOT" \
  CXX="$CXX --sysroot=$SYSROOT"

make clean
make -j$(nproc)
make install

echo ">>> 完成: $OUT_DIR/lib/libfdk-aac.so"

使用方式:./build_android.sh arm64-v8a

编译之后的so和头文件都在out目录

如何判断编译出来的so是自己想要架构的so

file libfdk-aac.so
libfdk-aac.so: ELF 64-bit LSB shared object, ARM aarch64, ...

这里会显示是 aarch64(arm64-v8a)还是 ARM(armeabi-v7a)。

参考文章:

编译x264,x265,fdk-aac, ffmpeg 测试并运行 

fdk-aac 交叉编译 so