AAC与PCM转化–libfaac及libfdk-aac使用

  • Post author:
  • Post category:其他




1、AAC的两种编码格式



《1》、ADTS格式

ADTS头包含了AAC文件的采样率、通道数、帧数据长度等信息,分为固定头信息和可变头信息两部分。


ADTS头一般是7个字节(28bit+28bit)/8,若ADTS头的 protection_absent字段值为0时则为9个字节。


在这里插入图片描述

固定头部信息结构体说明如下:

在这里插入图片描述


profile的值等于 Audio Object Type的值减1,即是profile=Audio Object Type – 1;


在这里插入图片描述

示例如下:

在这里插入图片描述

0xfff 帧开始标志syncword
0x01(0001) --- [0--MPEG4, 00--layer , 0--protection_absent]
0x4c803a61c8(0100 1100 1000 0000 0011 1010 0110 0001 1100 1000) 
 ---- [ 01--AAC LC, 0011--48 KHZ, 0--private_bit, 010--双通道 , 0--original_copy, 0--home
      0--copyright_identification_bit, 0--copyright_identification_start, 
     0000 1110 1001 1 ---aac帧长度, 0000 1110 010--adts_buffer_fullness,
       00--number_of_raw_data_blocks_in_frame
    ]



《2》ADIF格式

ADIF只有一个统一的头,所以必须得到所有的数据后才能进行解码,一般用于磁盘文件中,实时流协议中不使用。

在这里插入图片描述



2、PCM存储格式

在这里插入图片描述



3、libfdk-aac使用

使用libfdk-aac并无太多注意的地方。

有一点值得注意的是在进行编码之前需要根据PCM的数据格式将输入的buffer进行数据转化(8bit采样位数的不需要)

//ret = 输入数据大小(Byte)
//input_buf,输出PCM数据的缓存区
//convert_buf, 转化的结果
//该转化将PCM数据的高低位合并起来
for (i = 0; i < ret / 2; i++)
{
    const char* in = &input_buf[2*i];
    convert_buf[i] = in[0] | (in[1] << 8);
}


当输入样本的数量不等于调用下面算出的input_size时,调用aacEncEncode进行转化会没有输出,直到输入累积到input_size才会有输出。

aacEncInfo(aacEncHandle, &info);
int input_size       = channel * 2 * info.frameLength;



4、libaac使用

《1》pcm到aac命令

faac 225.18.1.2.pcm -o test.aac -C 2 -R 8000 -B 16 --mpeg-vers 4 -X

《2》、ffmpeg aac转PCM

ffmpeg.exe -i audio_chn0.aac -f s16le -ar 8000 -ac 2 -acodec pcm_s16le -y pcm8k.pcm

-acodec pcm_s16le:输出pcm格式,采用signed 16编码,字节序为小尾端(大尾端为be);

-ar 8000: 采样率为8000

-ac 1: 声道数为2


当调用faacEncEncode函数时,其参数中的输入样本数量必须等于调用faacEncOpen函数返回的输入样本数量,否则转换结果是错的!

这里和libfdk-aac是有差异的,libfdk-aac若输入样本不足不会输出错误结果而是等到有足够样本时输出。



5、对比

网上这篇

博文

说libfdk-aac的转化效果好,但我实际对比后发现还是libaac的音质好很多,libfdk-aac的设置也是按照它源码demo来设置的。

速度的话是libfdk_aac比libaac快上不少。



6、

demo

demo是在centos6.9上实现的。



7、参考

《1》、

ADTS头部参考


《2》、

faac参考


《3》、

libfdk-aac参考



版权声明:本文为FPGATOM原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。