AAC格式
- AAC音频文件有一帧一帧的ADTS帧组成,每个ADTS帧包含ADTS头部和AAC数据,如下所示
- ADTS头部的大小通常为7个字节,包含着这一帧数据的信息,由固定和可变两部分组成
- 固定部分
- 可变部分
- 各字段的意思如下
- syncword :总是0xFFF, 代表一个ADTS帧的开始, 用于同步.
- ID :MPEG Version: 0 for MPEG-4,1 for MPEG-2
- layer :always: ‘00’
- protection_absent :Warning, set to 1 if there is no CRC and 0 if there is CRC
- profile :表示使用哪个级别的AAC,如01 Low Complexity(LC) – AAC LC
- sampling_frequency_index :采样率的下标
- aac_frame_length :一个ADTS帧的长度包括ADTS头和AAC原始流
- adts_buffer_fullness :0x7FF 说明是码率可变的码流
- number_of_raw_data_blocks_in_frame :表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧
AAC的RTP打包
- AAC的RTP打包方式并没有向H.264那样丰富,我知道的只有一种方式,原因主要是AAC一帧数据大小都是几百个字节,不会向H.264那么少则几个字节,多则几千
- AAC的RTP打包方式就是将ADTS帧取出ADTS头部,取出AAC数据,每帧数据封装成一个RTP包
- 需要注意的是,并不是将AAC数据直接拷贝到RTP的载荷中。AAC封装成RTP包,在RTP载荷中的前四个字节是有特殊含义的,然后再是AAC数据,如下图所示
- 其中RTP载荷的一个字节为0x00,第二个字节为0x10
- 第三个字节和第四个字节保存AAC Data的大小,最多只能保存13bit,第三个字节保存数据大小的高八位,第四个字节的高5位保存数据大小的低5位
- AAC RTP包的时间戳计算
假设音频的采样率位44100,即每秒钟采样44100次,AAC一般将1024次采样编码成一帧,所以一秒就有44100/1024=43帧,RTP包发送的每一帧数据的时间增量为44100/43=1025,每一帧数据的时间间隔为1000/43=23ms。