简介

fdk-aac可用于aac编解码器,源码链接:

https://github.com/mstorsjo/fdk-aac

选择Tags下的一个稳定版本,如v2.0.2,进行下载

编译

  • 解压压缩文件
tar -xvf fdk-aac-2.0.2.tar.gz

添加sigmastar_uclibc_config.cmake文件:

# 参考 https://cmake.org/cmake/help/v3.22/manual/cmake-toolchains.7.html#cross-compiling-for-linux
SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# 指定交叉编译器路径
SET(TOOLCHAIN_DIR "/opt/sigmaStar/arm-buildroot-linux-uclibcgnueabihf-4.9.4-uclibc-1.0.31/")
set(TOOLCHAIN_HOST "${TOOLCHAIN_DIR}/bin/arm-buildroot-linux-uclibcgnueabihf")set(CMAKE_CXX_COMPILER ${TOOLCHAIN_HOST}-g++)
set(CMAKE_C_COMPILER   ${TOOLCHAIN_HOST}-gcc)SET(CMAKE_FIND_ROOT_PATH  ${TOOLCHAIN_DIR}${TOOLCHAIN_DIR}/include${TOOLCHAIN_DIR}/lib )# 从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# 只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# 只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  • 添加编译脚本build.sh
#!/bin/bashROOT_PATH=`pwd`
TARGET_PATH=$ROOT_PATH/outputrm -rf output
rm -rf build
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$TARGET_PATH \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_TOOLCHAIN_FILE=$ROOT_PATH/sigmastar_uclibc_config.cmake \-DFDK_AAC_INSTALL_CMAKE_CONFIG_MODULE=OFF\-DFDK_AAC_INSTALL_PKGCONFIG_MODULE=OFF\-DBUILD_SHARED_LIBS=OFFmake -j 3
make install
  • 运行编译脚本
sh build.sh
  • 编译结果
root@ubuntu:~/fdk-aac-2.0.2/output# tree
.
├── include
│   └── fdk-aac
│       ├── aacdecoder_lib.h
│       ├── aacenc_lib.h
│       ├── FDK_audio.h
│       ├── genericStds.h
│       ├── machine_type.h
│       └── syslib_channelMapDescr.h
└── lib└── libfdk-aac.a
  • 拷贝include和lib到工程路径下

编码样例

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>#include <stdlib.h>
#include "fdk-aac/aacenc_lib.h"typedef struct {HANDLE_AACENCODER encoder;int input_size;int out_size;
} AAC_ENCODE_INFO_t, *PAAC_ENCODE_INFO_t;int initEncoder(int sample_rate, int channels, PAAC_ENCODE_INFO_t encode_info)
{if (encode_info == NULL) {return -1;}int ret = -1;int bitrate = 64000;int vbr = 0;HANDLE_AACENCODER encoder = NULL;int aot = AOT_AAC_LC;int afterburner = 1;CHANNEL_MODE mode;AACENC_InfoStruct info = { 0 };int input_size;switch (channels) {case 1: mode = MODE_1;       break;case 2: mode = MODE_2;       break;case 3: mode = MODE_1_2;     break;case 4: mode = MODE_1_2_1;   break;case 5: mode = MODE_1_2_2;   break;case 6: mode = MODE_1_2_2_1; break;default:fprintf(stderr, "Unsupported WAV channels %d\n", channels);goto CleanUp;}if (aacEncOpen(&encoder, 0, channels) != AACENC_OK) {fprintf(stderr, "Unable to open encoder\n");goto CleanUp;}if (aacEncoder_SetParam(encoder, AACENC_AOT, aot) != AACENC_OK) {fprintf(stderr, "Unable to set the AOT\n");goto CleanUp;}if (aacEncoder_SetParam(encoder, AACENC_SAMPLERATE, sample_rate) != AACENC_OK) {fprintf(stderr, "Unable to set the sample rate\n");goto CleanUp;}if (aacEncoder_SetParam(encoder, AACENC_CHANNELMODE, mode) != AACENC_OK) {fprintf(stderr, "Unable to set the channel mode\n");goto CleanUp;}if (aacEncoder_SetParam(encoder, AACENC_CHANNELORDER, 1) != AACENC_OK) {fprintf(stderr, "Unable to set the wav channel order\n");goto CleanUp;}if (vbr != 0) {if (aacEncoder_SetParam(encoder, AACENC_BITRATEMODE, vbr) != AACENC_OK) {fprintf(stderr, "Unable to set the VBR bitrate mode\n");goto CleanUp;}} else {if (aacEncoder_SetParam(encoder, AACENC_BITRATE, bitrate) != AACENC_OK) {fprintf(stderr, "Unable to set the bitrate\n");goto CleanUp;}}// It is usually TT_MP4_ADTS and TT_MP4_RAWif (aacEncoder_SetParam(encoder, AACENC_TRANSMUX, TT_MP4_ADTS) != AACENC_OK) {fprintf(stderr, "Unable to set the ADTS transmux\n");goto CleanUp;;}if (aacEncoder_SetParam(encoder, AACENC_AFTERBURNER, afterburner) != AACENC_OK) {fprintf(stderr, "Unable to set the afterburner mode\n");goto CleanUp;;}if (aacEncEncode(encoder, NULL, NULL, NULL, NULL) != AACENC_OK) {fprintf(stderr, "Unable to initialize the encoder\n");goto CleanUp;;}if (aacEncInfo(encoder, &info) != AACENC_OK) {fprintf(stderr, "Unable to get the encoder info\n");goto CleanUp;;}ret = 0;printf( "info.maxOutBufBytes = %u, info.frameLength = %u\n", info.maxOutBufBytes, info.frameLength);// default bit width is 16, 16 / 8 = 2input_size = channels * 2 * info.frameLength;CleanUp:if (ret != 0) {if (encoder != NULL) {aacEncClose(&encoder);}} else {encode_info->encoder= encoder;encode_info->input_size = input_size;encode_info->out_size = info.maxOutBufBytes;}return ret;
}void deInitEncoder(HANDLE_AACENCODER encoder)
{aacEncClose(&encoder);
}void encodeFrame(HANDLE_AACENCODER encoder, const uint8_t* in_buffer, int in_size, uint8_t* out_buffer, int out_size, int* out_bytes)
{if (encoder == NULL || in_buffer == NULL || in_size == 0 || out_buffer == NULL || out_size == 0) {return;}AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };AACENC_InArgs in_args = { 0 };AACENC_OutArgs out_args = { 0 };int in_identifier = IN_AUDIO_DATA;int in_elem_size;int out_identifier = OUT_BITSTREAM_DATA;int out_elem_size;AACENC_ERROR err;// 2 bytes per sample pointin_args.numInSamples = in_size / 2;in_elem_size = 2;in_buf.numBufs = 1;in_buf.bufs = (void**)&in_buffer;in_buf.bufferIdentifiers = &in_identifier;in_buf.bufSizes = &in_size;in_buf.bufElSizes = &in_elem_size;out_elem_size = 1;out_buf.numBufs = 1;out_buf.bufs = (void**)&out_buffer;out_buf.bufferIdentifiers = &out_identifier;out_buf.bufSizes = &out_size;out_buf.bufElSizes = &out_elem_size;if ((err = aacEncEncode(encoder, &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) {fprintf(stderr, "Encoding failed\n");}*out_bytes = out_args.numOutBytes;printf("out_args.numOutBytes = %d, out_args.numInSamples = %d\n", out_args.numOutBytes, out_args.numInSamples);
}

说明:

  1. 输入默认音频为8k采样率,单通道,16bit位宽的PCM格式,每秒数据为8000116/8=16000字节
  2. 编码后的aac数据为ADTS格式,可改变TT_MP4_ADTS为TT_MP4_RAW获取裸数据,也可以通过跳过ADTS帧头
  3. info.maxOutBufBytes表示编码后的每帧的最大数据,当前为768字节
  4. 当前编码输出为固定的768字节,如果需要可变码率设置vbr为1-5,码率依次升高,编码输出长度为1-768字节
  5. 编码后的实际长度根据out_bytes 对输出数据进行存储
  6. aac是1024个采样点数据进行一次编码,对应的PCM格式长度为2048字节,那么对应的aac帧率为16000/2048=7.813。由于AENC编码的数据不是刚好2048字节,通常为640字节,那么需要一个循环数组对数据进行存储,当长度满足input_size后再进行一次编码

fdk-aac交叉编译与使用相关推荐

  1. linux编译fdk aac,如何在Linux下编译并安装Fraunhofer FDK AAC?

    AAC(高端音频编码, Advanced Audio Coding)在低比特率下会丢失许多高频信号而导致声音听起来和原始音质差异很大,因此后来出现了结合著SBR(Spectral Band Repli ...

  2. linux编译fdk aac,使用NDK编译ffmpeg4.1+fdk-aac2.0

    基本配置 ubuntu18 ffmpeg4.1.3 fdk-aac2.0.0 NDK r20b 编译fdkaac静态库脚本 #!/bin/bash NDK=/系统ndk路径/android-ndk-r ...

  3. linux编译fdk aac,Ubuntu下利用NDK编译ffmpeg+x264+fdk-aac

    由于FFmpeg.x264.Fdk-aac的版本问题,所以编译的时候有很多坑 编译顺序: 首先利用脚本分别编译x264和fdk-aac库,生成头文件(.h)与静态库文件(.a/.la). 将FFmpe ...

  4. android ffmpeg 静态库,在CentOS中编译FFmpeg for Android静态库(含fdk aac,x264)

    本文可以编译出集成了x264和fdk_aac的库,而且支持neon 下载源码: fdk_aac目前最新版是0.1.4,详见其ChangeLog,此处用的是0.1.1版 ffmpeg-2.7.2 解压后 ...

  5. FFmpeg音频编码 ---- pcm转aac(使用新版ffmpeg API,亲测可用)

    /** * @projectName 08-01-encode_audio * @brief 音频编码 * 从本地读取PCM数据进行AAC编码 * 1. 输入PCM格式问题,通过AVCodec的sam ...

  6. FFmpeg简单使用:音频编码 ---- pcm转aac

    基本流程  函数说明 avcodec_find_encoder:根据指定的AVCodecID查找注册的编码器. avcodec_alloc_context3:为AVCodecContext分配内存. ...

  7. 一些常见的AAC编解码库

    一些AAC编解码库 - FAAC, FAAD/FAAD2    ---编码只有AAC LC - neroAACenc ---非商业可以使用(提供编码工具) - FFmpeg's native AAC ...

  8. FFmpeg源码编译出支持音频AAC编码以及H264,H265编码的库

    先决条件: 需要安装msys2(是一个在windows中模拟linux操作系统的软件) 由于在linux中编译ffmpeg比较简单, 所以利用一下msys2, 直接去官网下载安装即可 需要安装visu ...

  9. AAC 编码基本说明

    Advanced Audio Coding (AAC) 是 MP3 的后继格式,它被定义於 MPEG-4 part 3 (ISO/IEC 14496-3).它通常使用在 MP4 容器内:对于音乐习惯上 ...

  10. FFMpeg输出AAC

    在音频中,无论直播与点播,AAC都是目前最常用的一种音频编码格式,例如RTMP直播,HLS直播,RTSP直播,FLV直播,FLV点播,MP4点播等文件中都是常见的AAC音频. 与MP3相比,AAC是一 ...

最新文章

  1. java reduce.mdn_reduce高级用法
  2. windows下配置安装YAF环境
  3. 【三万字!】Dubbo、Zookeeper学习笔记!秒杀面试官!——双非上岸阿里巴巴系列
  4. osg专业名词:LOD、数据分页、动态调度
  5. HDU-5532Almost Sorted Array LIS问题
  6. 360手机助手游戏怎么实名认证 360手机助手下载的游戏怎么关了悬浮窗
  7. 实现线段切割法_切割晶圆及玻璃产品的现代技术与设备
  8. 《大话设计模式》读书笔记-第13章 建造者模式
  9. Atom飞行手册翻译: 2.5 查找和替换
  10. 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
  11. shell自定义数组元素分隔符
  12. 获得对摄像头的访问权
  13. php 数组任意位置插入值
  14. oracle性能优化 pdf,Oracle性能优化技术内幕 pdg-pdf
  15. 【教程】生态环境影响评价技术应用及典型实践案例分析
  16. Ubuntu输入简体中文变成繁体
  17. 服务器托管双线技术方案
  18. 日本房产泡沫的崩塌,虽然很长,希望80后仔细阅读
  19. AprilTag二维码检测和定位
  20. ArcGIS申请添加天地图服务

热门文章

  1. WEB前端和JAVA薪资前景究竟哪个更高?
  2. Qt Creator下载和安装
  3. Python 资源大全
  4. 中央空调如何调节温度html,中央空调怎么调温度—中央空调怎么设置温度
  5. 2018杭州-云栖大会
  6. 【Error】com.google.inject.CreationException: Unable to create injector
  7. 手把手教程-lex与yacc/flex与bison入门(一)(使用windows环境)
  8. stata F值缺失_Stata:刀切法-去一法-Jackknife 简介
  9. Oracle 11g笔记——数据库启动
  10. 安卓可以用计算机隐藏照片吗,用美图看看安卓版随心隐藏私人图片!