深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
在数字音频的广阔领域中,AAC 编码及其相关的 ADTS 格式扮演着至关重要的角色。无论是在我们日常使用的音乐 APP,还是高清视频中的音频部分,都能看到它们的身影。今天,就让我们深入探索 AAC 编码原理与 ADTS 格式的奥秘,揭开它们高效处理音频数据的神秘面纱。
一、走进 AAC 编码
(一)AAC 编码的诞生背景
随着数字音频技术的不断发展,人们对音频质量和文件大小的要求越来越高。传统的 MP3 编码在一定程度上已经无法满足这些需求,于是,AAC(Advanced Audio Coding,高级音频编码)应运而生。它是由 Fraunhofer IIS、杜比实验室、索尼等公司共同开发的一种音频编码标准,旨在提供更高质量的音频压缩,同时减小文件体积。可以说,AAC 编码就像是音频领域的新一代 “工匠”,用更精湛的技艺打造出既节省空间又保证音质的音频作品。
(二)AAC 编码特点
1.感知编码技术:AAC 编码的核心基于感知编码技术,这是一种模仿人类听觉系统特性的编码方式。人类听觉系统有一个有趣的特性 —— 掩蔽效应。简单来说,当一个强音和一个弱音同时存在时,弱音可能会被强音 “掩盖”,我们的耳朵就难以察觉到弱音的存在。AAC 编码巧妙地利用了这一特性,通过分析音频信号的频率、幅度等信息,将那些被掩蔽的音频成分去除,从而在不影响听觉体验的前提下,大大减小了音频数据量。这就好比在一幅复杂的画作中,巧妙地隐藏一些不影响整体视觉效果的细节,使画作既保持美观又占用更少的存储空间。
虚线为人耳能察觉的声压阈值,当环境中存在强音掩蔽音是,声压阈值随之提高(蓝色曲线),而低于这个掩蔽阈值而高于虚线的声音会被岩壁音掩盖。
2.多声道支持:在当今的音频应用中,多声道音频越来越普及,比如常见的 5.1 声道、7.1 声道等。AAC 编码对多声道音频提供了良好的支持。它能够有效地对多个声道的音频数据进行编码,在保证各个声道声音质量的同时,合理地压缩数据。以家庭影院系统为例,AAC 编码可以将不同声道的声音,如前方的主声道、后方的环绕声道等,精确地编码并传输,让我们在家中就能享受到身临其境的音频体验。
3.灵活的采样率和比特率:AAC 编码支持多种采样率和比特率设置。采样率决定了音频信号在单位时间内的采样点数,比特率则表示单位时间内传输的音频数据量。通过灵活调整这两个参数,AAC 可以适应不同的应用场景和网络环境。比如在网络带宽有限的情况下,可以选择较低的采样率和比特率,保证音频能够流畅传输;而在对音质要求较高的音乐制作场景中,则可以选择较高的采样率和比特率,以获得更出色的音质。这就像一个可以根据不同路况调整速度的智能汽车,总能找到最合适的行驶方式。
(三)AAC编码深度解析
此部分内容参考音视频编解码——音频编解码格式AAC(Advanced Audio Coding)
编码流程:
-
音频分帧:AAC 编码的第一步,是将连续的音频信号进行巧妙 “切割”,这就是音频分帧。想象一下,音频信号是一条源源不断流淌的声音长河,为了更好地处理它,我们需要把它切成一段段固定长度的 “小片段”,这每一段就叫做一帧。通常情况下,每帧会包含几十毫秒的音频数据,这个长度是经过精心挑选的。如果帧太长,处理起来计算量太大;如果帧太短,又会丢失音频的连贯性。这就好比把一长卷电影胶片切成一段段合适长度的小胶片,每一段都能独立又完整地记录一小段精彩的画面。
-
窗函数应用:分好帧后,每个音频帧都要 “戴上” 一个特殊的 “滤镜”—— 窗函数。音频信号在时域中是连续变化的,当进行频谱分析时,如果直接处理,会出现频谱泄漏的问题,就像光线透过不完美的窗户发生散射一样,导致分析结果不准确。窗函数就像是一个温柔的 “整形工具”,它可以让音频帧的边缘变得平滑,减少频谱泄漏。不同类型的窗函数有着不同的 “整形效果”,常见的有汉宁窗、汉明窗等,AAC 会根据具体的应用场景选择合适的窗函数,让音频帧以最好的状态进入下一个处理环节。
-
频谱分析:经过窗函数 “温柔处理” 后的音频帧,接下来要开启一场神奇的 “频率之旅”—— 频谱分析。这一步通常借助快速傅里叶变换(FFT)来实现,FFT 就像是一把神奇的钥匙,能把时域的音频信号转换为频域表示。在时域中,我们看到的音频信号是随时间变化的波形,而在频域中,就像打开了一个神秘的频率宝藏箱,我们可以清楚地看到信号包含的不同频率成分及其强度。这就好比把一幅彩色画按照不同颜色的频率进行分解,每种颜色的频率就是音频信号中的一个频率成分,通过这种方式,AAC 能够更方便地分析和处理音频信号。
-
感知模型:基于人耳的感知特性,AAC 编码引入了感知模型,这是整个编码过程中最具智慧的环节之一。人耳有着独特的掩蔽效应,AAC 编码利用这个特性,对频谱进行掩蔽效应处理。它会像一个聪明的管理者,精准地识别出那些被强音掩盖的弱音区域,然后减少对这些掩盖区域的编码量,这样在不影响我们听觉体验的前提下,大大减小了音频数据量,实现了高效的压缩。
-
量化和编码:经过感知模型处理后,接下来要对频谱进行量化和编码。根据频谱中系数幅度的大小,合理地分配表示它们所需的比特数。对于那些幅度较小的系数,就像一些不太重要的小物件,用较少的比特来表示;而对于幅度较大的系数,如同重要的大物件,则用更多的比特表示。这样做的目的是在保证音频质量的同时,尽可能地减少数据量。但量化过程不可避免地会造成一些信息损失,就像用低分辨率去拍摄照片,会丢失一些细节,但 AAC 通过巧妙的算法,将这种损失控制在人耳难以察觉的范围内。
-
熵编码:量化后的音频数据,还能进一步压缩,这就要靠熵编码技术了,常见的如霍夫曼编码等。熵编码就像是一根神奇的魔法棒,它利用数据的统计特性,对出现概率高的符号用较短的编码表示,对出现概率低的符号用较长的编码表示。比如在一段音频数据中,如果某个量化值经常出现,就给它分配一个短编码;而很少出现的量化值,就用长编码。通过这种方式,进一步减少了数据量,让音频文件变得更小,同时又能保证在解码时准确还原数据。
-
打包和封装:经过前面一系列复杂的处理,压缩后的音频数据还需要进行最后的 “包装”—— 打包和封装。这一步就像是把整理好的物品整齐地装进一个包装盒里,同时附上详细的清单和标识。AAC 编码会把这些压缩后的音频数据打包为 AAC 格式的数据流,并且添加音频元数据,比如采样率、声道数等重要信息,以及同步信息,这些信息就像是包装盒上的标签和说明书,方便接收设备准确地解析和播放音频数据。
二、认识 ADTS 格式
在打包和封装后,AAC会把编码后的音频数据集存成ADIF格式或ADTS格式,ADIF格式的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。而ADTS这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。由于⽬前⼀般编码后的和抽取出的都是 ADTS格式的⾳频流,所以我们着重介绍ADTS格式。
(一)ADTS 是什么
ADTS(Audio Data Transport Stream,音频数据传输流)是一种 AAC 音频数据的传输格式,它为 AAC 编码后的音频数据提供了一种结构化的封装方式。可以把 ADTS 格式想象成一个精美的包装盒,AAC 编码后的音频数据就像珍贵的礼物被装在这个盒子里,方便在不同的设备和系统中传输和处理。ADTS 格式定义了音频数据的帧结构、同步信息、错误检测等内容,确保音频数据能够准确无误地被接收和播放。
(二)ADTS 的帧结构
-
ADTS 头:ADTS 头是 ADTS 帧的重要组成部分,它包含了许多关键信息。ADTS 头的长度一般为 7 或 9 个字节(取决于是否包含 CRC 校验字段),就像一个小而强大的 “指挥中心”。在这个 “指挥中心” 里,有采样率索引,它告诉接收设备音频数据的采样率是多少;还有声道配置信息,让设备知道这是单声道、立体声还是多声道音频;另外,帧长度字段则明确了整个 ADTS 帧的长度,方便接收设备准确地解析数据。
-
AAC 音频数据:在 ADTS 头之后,就是经过 AAC 编码的音频数据了。这些数据按照一定的规则排列,是我们最终听到的声音的数字体现。不同的 AAC 编码配置,会导致音频数据的结构和内容有所不同,但都被有序地封装在 ADTS 帧中。
adts_fixed_header()大小28bits,具体内容包括
- syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
- ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2
- Layer:always: '00'
- protection_absent:表示是否误码校验。注意,这一位为1那么没有CRC校验字段,那么ADTS 头为7字节,如果这意味为0,那么有CRC校验字段,那么ADTS 头为9字节.
- CRC and 0 if there is CRC
- profile:表示使⽤哪个级别的AAC,如01 Low Complexity(LC)--- AAC LC,有些芯⽚只⽀持AAC LC
- sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies数组中查找得知采样率的值。
- channel_configuration: 表示声道数,⽐如2表示⽴体声双声道
固定头信息中的数据每⼀帧都相同
adts_variable_header()大小28bits,具体内容包括
- 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原始帧。 所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个 AAC数据块。
可变头信息中的数据每⼀帧可能不同
(三)ADTS 格式的优势
-
同步性好:ADTS 格式具有良好的同步性。它的帧结构中包含了同步字,接收设备可以通过检测同步字快速找到 ADTS 帧的起始位置,实现音频数据的准确同步。这就好比在一场接力比赛中,每个运动员都能准确地找到交接棒的位置,保证比赛的顺利进行。在实时音频传输场景中,如网络直播、语音通话等,这种良好的同步性尤为重要,能够确保声音的连贯和稳定。
-
错误检测与纠正:ADTS 格式支持错误检测和部分纠正功能。通过 CRC(循环冗余校验)字段,接收设备可以检测到数据在传输过程中是否发生错误。如果发现错误,虽然不能完全纠正,但可以采取相应的措施,如丢弃错误帧,避免错误数据对音频播放质量的影响。这就像给音频数据穿上了一层 “防护衣”,在一定程度上保证了音频的质量。
三、AAC 编码与 ADTS 格式的应用场景
(一)在线音乐平台
如今,我们常用的在线音乐平台,如 QQ 音乐、网易云音乐等,大多采用 AAC 编码结合 ADTS 格式来存储和传输音乐文件。这样做的好处显而易见,一方面,AAC 编码可以在保证音质的前提下,减小音乐文件的大小,节省用户的流量和设备存储空间;另一方面,ADTS 格式的良好同步性和错误检测功能,确保了音乐在网络传输过程中的稳定性,让用户能够流畅地播放音乐,享受高品质的听觉盛宴。
(二)视频媒体
在视频领域,无论是电影、电视剧,还是各种短视频平台,AAC 编码和 ADTS 格式也被广泛应用。高清视频往往伴随着高质量的音频,AAC 编码的多声道支持和优秀的音质表现,能够完美地配合视频画面,为观众带来沉浸式的视听体验。而 ADTS 格式的结构化封装,使得音频数据能够与视频数据准确同步,避免了声画不同步的问题。例如,在观看高清电影时,我们能清晰地听到从各个方向传来的声音,仿佛置身于电影场景之中,这都离不开 AAC 编码和 ADTS 格式的功劳。
(三)移动设备音频应用
在移动设备上,如手机、平板电脑等,资源相对有限,对音频文件的大小和播放效率有较高的要求。AAC 编码的高效压缩特性和 ADTS 格式的简洁结构,使其成为移动设备音频应用的理想选择。无论是手机自带的音乐播放器,还是各种音频编辑 APP,都常常采用 AAC 编码和 ADTS 格式来处理音频数据,既能保证音频质量,又能适应移动设备的性能和存储限制。
四、AAC 编码与 ADTS 格式的发展展望
随着技术的不断进步,音频领域也在持续发展。未来,AAC 编码和 ADTS 格式有望进一步优化,以适应更高的音频质量需求和更复杂的应用场景。例如,在虚拟现实(VR)和增强现实(AR)领域,对音频的空间感和实时性要求极高,AAC 编码和 ADTS 格式可能会进一步提升多声道处理能力和同步性能,为用户创造更加逼真的音频环境。同时,随着 5G 网络的普及,网络带宽的提升为高质量音频传输提供了更广阔的空间,AAC 编码和 ADTS 格式也可能会利用这一优势,进一步提高音频的码率和音质,为我们带来更加卓越的音频体验。
AAC 编码原理和 ADTS 格式是数字音频技术的重要成果,它们在众多领域的广泛应用,极大地丰富了我们的数字生活。通过深入了解它们的原理、格式和应用,我们能够更好地欣赏和利用数字音频资源,也能为相关技术的进一步发展贡献自己的智慧。希望这篇文章能让你对 AAC 编码原理和 ADTS 格式有更深入的认识,在数字音频的世界里探索更多的精彩。