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参考
    
   
 
