一、简介
1.1 什么是 FDK-AAC?
FDK-AAC(Fraunhofer Development Kit for Advanced Audio Coding)是一个用于音频编码和解码的软件开发工具包。该工具包基于 MPEG-2 和 MPEG-4 AAC 标准,并在各种设备和平台上实现了高效、高质量的音频编码和解码。
FDK-AAC 支持多种音频编解码格式,包括 SBR、PS、HE-AAC、AAC-ELD 等。这些格式提供了更高的压缩率和更好的音质,使您可以为您的应用提供出色的音频体验。
1.2 FDK-AAC 可以用来做什么?
由于其高质量和高效的特性,FDK-AAC 可以在多个领域中得到广泛应用:
- 广播和流媒体服务:FDK-AAC 提供了高质量、低延迟的音频编码,可以用于广播和流媒体服务。
- 媒体播放器:您可以使用 FDK-AAC 在您的媒体播放器中实现高效的音频解码功能,为用户提供更优质的音频体验。
- 视频会议和语音通话:由于其低延迟和高质量的特点,FDK-AAC 也可以用于视频会议和语音通话应用中。
- 游戏开发:在游戏开发中,FDK-AAC 可以帮助您在游戏中实现高效、高品质的音频效果。
- FDK-AAC 的特点
1.3 FDK-AAC 主要特点:
- 高质量和高效:FDK-AAC 提供了高质量和高效的音频编解码能力,使其成为许多音频处理场景的理想选择。
- 支持多种格式:FDK-AAC 支持多种音频编解码格式,包括 SBR、PS、HE-AAC、AAC-ELD 等。
- 跨平台支持:FDK-AAC 可以在多种操作系统上运行,包括 Windows、Linux、Mac OS X 等。
- 易于集成:FDK-AAC 提供了简单的 API 接口,使得它很容易地与其他软件系统进行集成。
- 免费开源:FDK-AAC 是免费的开源软件,您可以自由地使用、修改和分发它。
如果您需要在您的应用程序中实现高质量的音频编解码功能,那么 FDK-AAC 就是您的理想选择。通过使用 FDK-AAC,您可以轻松地实现出色的音频体验,为您的用户提供更多的价值。
2. FDK-AAC 编译:
2.1 源码地址:
源码地址如下:
https://github.com/mstorsjo/fdk-aac
下载代码到本地,并切换到v2.0.1
git clone https://github.com/mstorsjo/fdk-aac.git
2.2 编译环境:
本人使用的MAC电脑进行编译,mac 版本号为: Mac os 12.6.7
编译前需要准备好ndk工具,NDK 版本为:/Users/Library/Android/sdk/ndk/21.0.6113669
2.3 编译脚本
在根目录下新建build_android.sh 文件,文件内容如下:
#!/bin/sh
# --- 脚本信息 Start ---
version="0.0.1(1)"
# --- 脚本信息 End ---
# --- 输入参数指定 Start ---
# lame库目录
libDir="/Users/xxx/Documents/projectc/fdk-aac"
# ndk目录
ndkDir="/Users/xxx/Library/Android/sdk/ndk/21.0.6113669"
# 输出的库目录
productRootDir="/Users/xxx/Documents/projectc/fdk-aac/android"
# 架构
archs="armeabi-v7a arm64-v8a x86 x86_64"
# api等级
androidApiLevel="21"
# --- 输入参数指定 End ---
for arch in ${archs}
do
echo "comile arch: ${arch}"
case $arch in
armeabi-v7a)
archHost="armv7a-linux-androideabi"
crossCompile="arm-linux-androideabi"
;;
arm64-v8a)
archHost="aarch64-linux-android"
crossCompile=${archHost}
;;
x86)
archHost="i686-linux-android"
crossCompile=${archHost}
;;
x86_64)
archHost="x86_64-linux-android"
crossCompile=${archHost}
;;
*) echo "Parameter is not valid."
exit
;;
esac
export CC="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${archHost}${androidApiLevel}-clang"
export CXX="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${archHost}${androidApiLevel}-clang++"
prebuilt="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64"
export AS=${prebuilt}/bin/${crossCompile}-as
export LD=${prebuilt}/bin/${crossCompile}-ld
export NM=${prebuilt}/bin/${crossCompile}-nm
export STRIP=${prebuilt}/bin/${crossCompile}-strip
export RANLIB=${prebuilt}/bin/${crossCompile}-ranlib
export AR=${prebuilt}/bin/${crossCompile}-ar
productDir="${productRootDir}/${arch}"
rm -rf ${productDir}
mkdir ${productDir}
cd ${libDir}
./autogen.sh
# config
./configure \
--host=${archHost} \
--enable-shared \
--disable-static \
--target=android \
--disable-frontend \
--enable-static \
--prefix="${productDir}"
# make
make clean
make -j8
make install
done
在根目录下运行如下命令:
./build_android.sh
在编译的过程中会遇到如下问题:
libSBRdec/src/lpp_tran.cpp:122:10: fatal error: 'log/log.h' file not found
#include "log/log.h"
^~~~~~~~~~~
1 error generated.
make: *** [libSBRdec/src/lpp_tran.lo] Error 1
make: *** Waiting for unfinished jobs....
CXX libSBRdec/src/lpp_tran.lo
libSBRdec/src/lpp_tran.cpp:122:10: fatal error: 'log/log.h' file not found
#include "log/log.h"
^~~~~~~~~~~
1 error generated.
make: *** [libSBRdec/src/lpp_tran.lo] Error 1
通过log可以看出 libSBRdec/src/lpp_tran.cpp文件中找不到“log/log.h"头文件,打开对应的文件,查找根log.h 相关的代码不多,都是打印log。于是将相关的代码注释掉,再次重新编译。可以正常运行;
//121行-123行代码如下:
#ifdef __ANDROID__
#include "log/log.h"
#endif
// ...
//339行到344行代码:
#ifdef __ANDROID__
else {
// Safetynet logging
android_errorWriteLog(0x534e4554, "112160868");
}
#endif
//...
//937-942行代码如下:
#ifdef __ANDROID__
else {
// Safetynet logging
android_errorWriteLog(0x534e4554, "112160868");
}
#endif
2.4 编译结果
编译完成以后,可以在android 目录下看到生成的头文件和动态库,如下:

三.参考文献:

2531

被折叠的 条评论
为什么被折叠?



