一、什么是AAC
AAC的中文名称是高级音频编码技术,它是基于MPEG-2的一种全新的音频编码技术。随着时代的发展,目前AAC的技术升级到MPEG-4表准。AAC广泛的应用在网络传输、高清录制等领域,而AAC技术的出现就是为了取代之前的MP3格式。
二、为什么需要进行AAC进行音频压缩处理
一帧普通的PCM数据的比特率是很高的,以采样率48000,双声道、采样深度S16的PCM数据传输,假设视频文件是10分钟,那么视频大小就是100多M,这样的大小在网络传输中是不可取的,引入AAC后原来100多M的音频数据被压缩后只有几M
三、AAC的特点和优势
1.高压缩率:AAC的压缩比为1:20,远比MP3的1:10高,相同时长的音频大小远远小于MP3大小
2.音质更好:AAC的音频还原度很高,音质相比于其他格式更加的优秀
3.更高的解码效率:解码播放AAC音频文件时,所占用的资源更少,解码时CPU使用率更低
四、AAC格式详解
AAC有两种不同的表现形式,一个是ADIF形式,另一种是ADTS形式。
ADIF形式:可以确认音频数据的开始位置,不能从中间解码,无法随机访问,无法跳播,适合存储在磁盘中
ADTS形式的AAC文件,可以在任何一帧开始解码,因为ADTS格式的每一帧都有头信息
4.1ADIF的数据结构
adif_header:adif的头部,一个adif形式的AAC文件只有一个头部
byte_alignment:用于字节对齐
因为每帧不是固定大小,故只能按照顺序进行解码,也无法跳播或快进快退。除非自己解码遍历整个文件建立每帧位置表。
4.2ADTS的结构
由上图可知一个ADTS的AAC一帧数据由两个部分组成,ADTS头部和AAC ES,AAC ES是AAC的裸流数据
ADTS Header由两部分组成,一部分是adts_fixed_header,另一部分是adts_variable_header
下面就详细的说一下这两部分。
1.1adts_fixed_header
syncword:固定是0xFFF,代表一个ADTS帧的开始
ID:MPEG标识符,0代表MPEG-4 1代表MPEG-2
layer:默认为0b00(二进制)
protection_absent:表示是否误码校验
profile:表示使用哪个级别的AAC,下面这个表格是profile的索引
Sample Frequence index:代表的时使用采样率下标,通过这个下标找到对应的采样率,如下图
private bit:私有位,编码的时候设置为0,解码的时候忽略这一位
channel configuration:声道数的配置,下面是声道数的配置表格
1 单声道 2 双声道 3 三声道 4 四声道 5 五声道 6 六声道 7 八声道 copy:编码的时候设置为0,解码的时候忽略这一位
home:编码的时候设置成0,解码的时候忽略这一位
1.2adts_varibale_header的表格如下
copyright_identificaion_bit:编码的时候设置为0
copyright_identifiction_start:编码的时候设置为0
aac_frame_length:ADTS帧的长度,包含ADTS头部和AAC es数据的长度,如果包含crc校验的话,ADTS头部的长度是9字节,不包含crc校验的话ADTS头部的长度就是7字节,所以aac_frame_length = (protection_absent == 0 ? 9:7) + audio_data_length
adts_buffer_fulness:固定为0x7FF,这个标识符是指可变码流
number_of_raw_data_blocks_in_frame:表示当前的帧有number_of_raw_data_blocks_in_frame+1个原始帧