【音视频 | AAC】AAC音频编码详解

😁博客主页😁:🚀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编码规格(Profile)

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封装格式

AAC有两种封装格式:

  • ADIF:全称 Audio Data Interchange Format,音频数据交换格式,该格式一般应用在将音频通过写文件方式存储在磁盘里的场景,不能进行随机访问,不允许在文件中间开始进行解码;只有拿到整个文件时才能开始进行渲染播放;
  • ADTS:全称 Audio Data Transport Stream,音频数据传输流,该格式的特征是用同步字节进行将 AAC 音频截断,然后可以允许客户端在任何地方进行解码播放,适合网络传输场景;

简单来说,ADTS可以在任意帧进行解码,每一个帧都有头信息,但ADIF却只有一个统一的头,所以必须得到所有的数据后才能解码。一个帧就能单独解码。

两种Header的形式也不同,目前一般编码后和抽取出的基本都是ADTS格式音频流。

✨3.1 ADIF 格式

这个格式比较少见,简单认识一下即可,下图是ADIF格式的序列,由adif_headerbyte_alignmentraw_data_stream三部分组成。byte_alignment是用来做字节对齐的,也就是说,ADIF格式由一个ADIF头信息(adif_header) 和 原始数据流(raw_data_stream) 构成。

下面看看ADIF头信息包括哪些内容,如下图:

✨3.2 ADTS 格式

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格式。

✨3.2.1 ADTS头部

ADTS头部有两部分,分为固定头部(adts_fixed_header)、可变头部(adts_variable_header):

固定头部(adts_fixed_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文件中,这个字段会出现不等于0x7FF0x000的情况,下面是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

相关推荐
MediaTea6 小时前
Pr 视频过渡:沉浸式视频 - VR 色度泄漏
音视频·vr
LNTON羚通6 小时前
算法定制LiteAIServer摄像机实时接入分析平台烟火检测算法的主要功能
音视频·视频监控
EasyCVR11 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
冷凝女子14 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
安步当歌15 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野15 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
顶呱呱程序15 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
EasyCVR16 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
runing_an_min16 小时前
ffmpeg 视频滤镜:屏蔽边框杂色- fillborders
ffmpeg·音视频·fillborders
我喜欢就喜欢1 天前
基于qt vs下的视频播放
开发语言·qt·音视频