博客主页:https://blog.csdn.net/wkd_007
博客内容:嵌入式开发、Linux、C语言、C++、数据结构、音视频
本文内容:介绍AAC音频编码
金句分享:你不能选择最好的,但最好的会来选择你——泰戈尔
本文未经允许,不得转发!!!
AAC(Advanced Audio Coding),中文名:高级音频编码。出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代MP3格式。
2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
本文简单地介绍AAC编码的一些基础概念,以及AAC格式的文件怎么组成的,需要了解更多AAC编码的内容,可以查看其相关文档《ISO-IEC 14496-3_2009》。
AAC共有9种规格(Profile),以适应不同的场合的需要:
MPEG-2 AAC LC
:低复杂度规格(Low Complexity) 注:比较简单,没有增益控制,但提高了编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点。MPEG-2 AAC Main
:主规格MPEG-2 AAC SSR
:可变采样率规格(Scaleable Sample Rate)MPEG-4 AAC LC
:低复杂度规格(Low Complexity)—现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件MPEG-4 AAC Main
:主规格 注:包含了除增益控制之外的全部功能,其音质最好MPEG-4 AAC SSR
:可变采样率规格(Scaleable Sample Rate)MPEG-4 AAC LTP
:长时期预测规格(Long Term Predicition)MPEG-4 AAC LD
:低延迟规格(Low Delay)MPEG-4 AAC HE
:高效率规格(High Efficiency)—这种规格适合用于低码率编码,有Nero ACC 编码器支持
最早是基于MPEG-2标准,称为:MPEG-2 AAC。后来MPEG-4标准在原来基础上增加了一些新技术,称为:MPEG-4 AAC。
流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+ SBR技术,HEv2就是AAC(LC)+ SBR + PS技术;
这里再说明一下HE和HEv2的相关内容:
HE:HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。
HEv2:用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。
AAC有两种封装格式:
ADIF
:全称 Audio Data Interchange Format,音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只有拿到整个文件时才能开始进行渲染播放;ADTS
:全称 Audio Data Transport Stream,音频数据传输流,该格式的特征是用同步字节进行将 AAC 音频截断,然后可以允许客户端在任何地方进行解码播放,适合网络传输场景;简单来说,ADTS可以在任意帧进行解码,每一个帧都有头信息,但ADIF却只有一个统一的头,所以必须得到所有的数据后才能解码。一个帧就能单独解码。
两种Header的形式也不同,目前一般编码后和抽取出的基本都是ADTS格式音频流。
这个格式比较少见,简单认识一下即可,下图是ADIF格式的序列,由adif_header
、byte_alignment
、raw_data_stream
三部分组成。byte_alignment是用来做字节对齐的,也就是说,ADIF格式由一个ADIF头信息(adif_header) 和 原始数据流(raw_data_stream) 构成。
下面看看ADIF头信息包括哪些内容,如下图:
ADTS 格式的AAC音频流是由一个个的ADTS帧组成的,下图是ADTS序列的语法,整个序列由若干个adts_frame
组成。
每个ADTS帧都是由ADTS头部
和AAC音频数据
组成,下图是adts_frame的语法,adts_fixed_header
(固定头部信息)和adts_variable_header
(可变头部信息)都属于ADTS头部数据,raw_data_block
表示AAC音频原始数据块。
下图是网络上对AAC音频流总结的一张图片,可以帮助我们宏观地认识AAC音频流的ADTS格式。
ADTS头部有两部分,分为固定头部(adts_fixed_header
)、可变头部(adts_variable_header
):
syncword
:占用12bit;
所有的bit位都是1。总是0xFFF,代表一个ADTS帧的开始,作为分界符,用于同步每帧起始位置。ID
:占用 1 bit;
表示MPEG版本,0代表MPEG-4, 1代表MPEG-2,一般用 0,因为都是属于 MPEG 的规范.。layer
:占用 2 bit;
一直是0;protection_absent
:占用 1 bit;
设置 1 表示没有CRC,整个ADST头为7字节;0 表示有CRC,整个ADST头为9字节。profile_ObjectType
:占用 2 bit,表示使用的AAC规格(profile);
该字段的解释取决于ID
位的值。如果ID等于1
,则该字段包含与ISO/IEC 13818-7中定义的ADTS流中的配置文件字段相同的信息,也就是MPEG-2的规格;当ID
为0是表示的是MPEG-4的规格,该字段的值等于 Audio Object Type 的值减1。字段取值如下面图片的表格。
sampling_frequency_index
:占用 4 bit;
表示采样率下标,字段取值及解释如下图:
private_bit
:占用 1 bit,编码时设置为0,解码时忽略;
详细解释参见ISO/IEC 11172-3, subclause 2.4.2.3 (Table 8)
channel_configuration
:占用 3 bit;
通道配置即声道数,一般 2 表示立体声双声道。更多的值参考下图:
original_copy
:占用 1 bit,编码时设置为0,解码时忽略;home
:占用 1 bit,编码时设置为0,解码时忽略。
可变头部(
adts_variable_header
)
字段解析:
copyright_identification_bit
:占用 1 bit,编码时设置为0,解码时忽略;copyright_identification_start
:占用 1 bit,编码时设置为0,解码时忽略;frame_length
:占用 13 bit,当前 ADTS 帧的长度,包括 ADTS 头(固定+可变)和 AAC 原始流,单位byte;adts_buffer_fullness
:占用 11 bit,0x7FF
表示码率可变的码流,0x000
表示固定码率的码流;
实际的AAC文件中,这个字段会出现不等于0x7FF
、0x000
的情况,下面是GPT的回复:adts_buffer_fullness字段表示AAC解码器中的缓冲区当前的填充量。这个字段的值代表了解码器输入缓冲区中未使用的字节数,可以用来衡量解码器缓冲区的剩余空间。理想状态下,这个值应该保持在一个合适的范围内,以确保解码器能够持续地接收和处理音频数据,而不会发生溢出或欠流的情况。number_of_raw_data_blocks_in_frame
:占用 2 bit;
该字段表示当前ADST帧中所包含的AAC帧的个数减一。为了最大的兼容性通常每个ADTS frame 包含一个AAC frame,所以该值一般为0。一个AAC原始帧包含一段时间内1024个采样及相关数据
crc(16bit)
当protection_absent == 0时,表示存在CRC,这里的两字节CRC,就携带了CRC信息。
本文介绍了AAC编码的一些基础知识,重点介绍了ADTS帧的相关内容。
如果文章有帮助的话,点赞、收藏⭐,支持一波,谢谢
参考资料:
音频压缩技术:AAC编码
AAC编码介绍
【网络通信 – 直播】音频流编码 – AAC 基础
AAC的ADTS头文件信息介绍
音频编码之aac编码原理
音频编码格式 - AAC