前排提示:之所以叫 “速通版”,前提是面向有一定音视频基础知识的人群,可参考本文快速了解一些重点信息和内容。
目录
整体结构
AAC - Advanced Audio Coding (高级音频解码), 首先定义在 MPEG-2 ,然后被采用到 MPEG-4 标准中,是一种有损音频压缩格式。
整体上看, AAC 文件 时由一系列的 AAC Sequence 组成,每个 Sequence 由 AAC Header + AAC ES 组成。
AAC 文件根据结构格式不同,分为 2 类:
- ADTS - Audio Data Transport Stream 音频数据交换格式(最常见)。
有同步字的比特流。
可以在任意帧做解码,也就是说它每⼀帧都有头信息。
适合网络传输,流媒体文件。pre- frame syncword header error_check raw_data_stream next-frame - ADIF - Audio Data Interchange 传输流格式 (已经很少用)。
只有⼀个统⼀的头,所以必须得到所有的数据后解码。
一般用于磁盘文件。header raw_data_stream
一、ADTS 帧(重点)
注意,AAC 原始数据编码以后,直接存储的文件无法播放,可能就是因为 AAC 文件的每⼀帧缺少了ADTS 头信息文件的包装拼接。这种情况需要对原始帧加上 ADTS 头,封装成 ADTS 帧就能正常播放了。结构如下:
AAC Frame = [ ADTS Header ] + [ AAC Audio Data ]
其中, ADTS Header 的长度只有 2 种固定大小:
- protection_absent == 0 // 表示长度是 9 Byte,会包含 2 Byte 的校验数据
- protection_absent == 1 // 表示长度是 7 Byte
二、ADTS Header
ADTS Header 包含两部分:固定头信息 和可变头信息。结构如下:
ADTS Header = [ Fixed header ] + [ Variable header ADTS Sequence ]
- ADTS 固定头信息
结构体定义
ADTS Header 结构体成员 | 占位大小 | 说明 |
syncword | 12 bit | 同步信息,表示 ADTS 帧的开始,固定值全 1 |
ID | 1 bit | MPEG标识,0 - MPEG4, 1 - MPE2 |
layer | 2 bit | 层信息,固定值全 0 |
protection_absent | 1 bit | CRC 校验信息,0 - 有校验,1 - 没有校验 |
profile | 2 bit | 级别,e.g. 值 01 - Low Complexity 即 AAC LC |
sample_frequency_index | 4 bit | 采样率索引,对应采样率数组中的采样率值 |
private_bit | 1 bit | 私有位,一般编码时置 0,解码时忽略 |
channel_configuration | 3 bit | 声道数, e.g. 值 2 - 立体声双声道 |
original_copy | 1 bit | 一般编码时置 0,解码时忽略 |
home | 1 bit | 一般编码时置 0,解码时忽略 |
实际文件举例:
- ADTS 可变头信息
结构体定义
ADTS Header 结构体成员 | 占位 | 说明 |
copyright_identification_bit | 1 bit | 版权保护,一般编码时置 0,解码时忽略 |
copyright_identification_start | 1 bit | 版权开始,一般编码时置 0,解码时忽略 |
frame_length | 13 bit | 帧长度,注意是包含 ADTS 头和 AAC 原始数据长度的计算之和。 |
adts_buffer_fullness | 11 bit | 码率可变的码流,固定值,全 1 |
number_of_raw_data_blocks | 2 bit | 计数 n,表示 一个 ADTS 帧中有 (n + 1) 个 AAC 原始帧 |
实际文件举例:
三、原始数据
注意:raw data block 结尾的部分,通常会有一些填充数据 ( byte_alignment ),目的是为了内存对齐。
PS:分享
一个 系统深入学习音视频 知识的课程 —— https://xxetb.xetslk.com/s/45jaSl
(学无止境,文章如有纰漏不足,欢迎您不吝指正!谢谢 ^_^)