【网络通信 -- 直播】音频流编码 -- AAC 基础
【1】AAC 简介
AAC(Advance Audio Coding),高级音频编码,1997 年产生,基于 MPEG-2 的音频编码技术,当时被称为 MPEG-2 AAC,作为 MPEG-2(MP2) 标准的延伸,随着 MPEG-4(MP4) 标准在 2000年的成型则 AAC 也称为 M4A;
【1.1】AAC 编码技术参数
- 采样率范围,8KHz-96KHz 范围比较广,即一秒在模拟信号上进行多少次采样;
- 码率,8kbps-576kbps,支持范围比较宽,在压缩比和质量上都能考虑到;
- 声道,最多支持 48 个主声道,16 个低频声道,声音细节更丰富,音乐场景也用的多;
- 采样精度,即一个采样点需要在计算机表示占用的字节数,一般用 2 字节 16bit 表示;
【1.2】AAC 编码的主要规格
根据不同的编码技术,AAC 的编码分为九种规格
- 1. MPEG-2 AAC LC 低复杂度规格(Low Complexity),编码方式比较简单,没有增益控制,但是提高了编码效率,在中等码率的编码效率和音质方面,都能找到平衡点;
- 2. MPEG-2 AAC Main 主规格
- 3. MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate)
- 4. MPEG-4 AAC LC 低复杂度规格(Low Complexity)
- 5. MPEG-4 AAC Main 主规格,包含了除增益控制之外的全部功能,音质最好
- 6. MPEG-4 AAC SSR 可变采样率规格(Scaleable Sample Rate)
- 7. MPEG-4 AAC LTP 长时期预测规格(Long Term Prediction)
- 8. MPEG-4 AAC LD 低延迟预测规格(Low Delay)
- 9. MPEG-4 AAC HE 高效率规格(High Efficency),这种规格适合用于低码率编码,有 Nero-ACC 编码器支持,是一种成熟的商用编码器;
【1.3】AAC 编码方式特点
- 1. AAC 高压缩比的音频编码方式,比 G7xx、MP3、AC3 系列的压缩比都高,并且质量和 CD 差不多,但是和比较新的 Opus 还是差点,不过 Opus 目前还未充分普及;
- 2. AAC 采用了变换编码算法,采用了更高的滤波器组,这是压缩高的原因;
- 3. AAC 为了提高压缩比,还采用了噪声重整,反向自适应预测,联合立体声和量化霍夫曼编码算法等新技术;
- 4. AAC 支持了更多的采样率和比特率,支持了 1-48 个音轨和多达 15 个低频音轨,具有多种语言兼容能力;
- 5. AAC 支持了更宽的声音频率范围,从 8KHz-96KHz 远宽于 MP3 的 16KHz-48KHz 范围;
- 6. AAC 特殊的算法可以保有声音频率甚高和甚低频率,声音细节更丰富更清晰更接近原声;
- 7. AAC 采用了优化算法,导致解码端简单,降低了解码端的处理复杂度;
【2】AAC 封装格式
【2.1】AAC 封装类型
- 1. ADIF,Audio Data Interchange Format 音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只有拿到整个文件时才能开始进行渲染播放;
- 2. ADTS,Audio Data Transport Stream 音频数据传输流,该格式的特征是用同步字节进行将 AAC 音频截断,然后可以允许客户端在任何地方进行解码播放,适合网络传输场景;
【2.2】AAC 封装头字段
ADIF 的格式
adif_sequence
adif_header + byte_alignment + raw_data_stream
adif_header + byte_alignment + raw_data_block ... ... + raw_data_block
ADTS 的格式
adts_sequence
adts_frame + adts_frame + ... ... + adts_frame
adts_fixed_header + adts_variable_header + error_check + raw_data_block + error_check
ADTS 序列图示
ADTS 帧头各字段含义
字段 | 长度 bits | 说明 | 解释 |
Syncword | 12 | all bits must be 1 | 总是0xFFF,代表一个ADTS帧的开始,作为分界符,用于同步每帧起始位置 |
ID 即 MPEG version | 1 | 0 for MPEG-4, 1 for MPEG-2 | 一般用 0,因为都是属于 MPEG 的规范 |
Layer | 2 | always 0 | |
Protection Absent | 1 | set to 1 if there is no CRC and 0 if there is CRC | |
Profile | 2 | the MPEG-4 Audio Object Type minus 1 | 代表使用哪个级别和规范的 AAC,其中 01 代表 Low Complexity(LC), 其中 profile 等于 Audio Object Type 的值减1 |
Sampling Frequency Index | 4 | MPEG-4 Sampling Frequency Index (15 is forbidden) | 采样率下标,由于 AAC 的采样率范围是 8KHz-96KHz,所以具体用那个,由该字段决定 |
Private Bit | 1 | set to 0 when encoding, ignore when decoding | |
Channel Configuration | 3 | MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE) | 通道配置即声道数,一般 2 表示立体声双声道 |
Originality copy | 1 | set to 0 when encoding, ignore when decoding | |
Home | 1 | set to 0 when encoding, ignore when decoding | |
Copyrighted identification bit | 1 | set to 0 when encoding, ignore when decoding | |
Copyrighted identification Start | 1 | set to 0 when encoding, ignore when decoding | |
Aac Frame Length | 13 | this value must include 7 or 9 bytes of header length FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame) | 一个 ADTS 帧的长度包括 ADTS 头和 AAC 原始流 |
ADTS Buffer Fullness | 11 | buffer fullness | 0x7FF 表示码率可变的码流 0x000 表示固定码率的码流 |
Number of AAC Frames | 2 | number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame | ADTS 帧中有 number_of_raw_data_blocks_in_frame + 1 个 AAC 原始帧; 则 number_of_raw_data_blocks_in_frame == 0 表示 ADTS 帧中有一个 AAC 数据块; (一个 AAC 原始帧包含一段时间内 1024 个采样及相关数据) |
CRC | 16 | CRC if protection absent is 0 | 校验字段,为可选字段 |
ADTS 各字段的取值范围
1. Profile 取值
Object Type ID | Aduio Object Type |
1 | AAC Main |
2 | AAC LC |
3 | AAC LTR |
4 | SBR |
5 | AAC scalable |
2. Sampling Frequency Index 采样率取值
3. Channel Configuration 通道数取值
ADTS 的 raw_data_block 基本码流组件,头部有 3 位标志位 id_syn_ele,指示六种不同类型的元素
参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。
【2】AAC格式简介
【3】AAC及其封装格式