Android FFMPEG编解码实践(二):Ubuntu 下 NDK r21e编译fdk-aac,并集成到ffmpeg

上一篇说了怎么交叉编译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

脚本写的比较丑陋,能用就行。有精通脚本语言的大佬可以自行优化一发。

执行脚本,开始编译。

本以为可以一路畅通无阻,但是编译报错了。

Android FFMPEG编解码实践(二):Ubuntu 下 NDK r21e编译fdk-aac,并集成到ffmpeg_第1张图片

这是编译环境的问题,网上查到的资料说是这个fdk-aac的源码开发环境是Android,所以里面有用到Android日志系统代码,好在用得不多,只要注释掉就OK。

知道了错误原因,这下就好办了,直接打开报错文件,注释掉头文件引用代码和日志输出代码(好在不是很多,只有两三处需要注释),然后保存,继续编译。

编译成功。

Android FFMPEG编解码实践(二):Ubuntu 下 NDK r21e编译fdk-aac,并集成到ffmpeg_第2张图片

 

二、将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”的编码器)

Android FFMPEG编解码实践(二):Ubuntu 下 NDK r21e编译fdk-aac,并集成到ffmpeg_第3张图片

 

 

你可能感兴趣的:(android,ubuntu,linux)