AAC编码详解
嵌入式音视频开发——AAC编码1. AAC 编码概述在嵌入式音视频开发中AACAdvanced Audio Coding高级音频编码是一种非常常见的有损音频压缩技术广泛应用于手机、机顶盒、车机、智能摄像头、会议终端、对讲设备以及各类流媒体系统中。AAC 属于 MPEG 音频标准体系的一部分核心思想是利用人耳听觉特性在尽量不明显损伤主观音质的前提下减少音频数据量。从工程实现上看AAC 不是单一格式而是一个编码家族。常见的包括AAC-LC最常见复杂度较低兼容性最好HE-AAC v1在 AAC-LC 基础上增加 SBR频带复制适合较低码率HE-AAC v2进一步增加 PS参数化立体声适合更低码率立体声AAC-LD / AAC-ELD面向双向通信和低时延场景xHE-AAC覆盖更宽码率范围并强化响度控制与自适应流媒体能力。对于嵌入式系统来说AAC 编码的真正难点通常不是“能不能编码”而是能否在有限 CPU 下实时编码能否在有限内存下稳定运行能否满足端到端时延要求能否在目标平台上保持可接受音质能否兼顾封装、传输、兼容性和授权成本。2. 为什么需要进行 AAC 音频压缩处理2.1 减少存储空间占用PCM 是未压缩音频数据量非常大。以 CD 音质音频为例采样率44.1 kHz位宽16 bit声道2则码率约为44,100 × 16 × 2 1,411,200 bps ≈ 1411 kbps文件大小计算公式为文件大小(Byte) 比特率(bps) × 时间(s) / 8简化写法文件大小(MB) ≈ 比特率(kbps) × 时间(s) / (8 × 1000)因此未压缩PCM格式的5分钟立体声音频约需50 MB存储空间而AAC编码在128 kbps码率下仅需约4.8 MB同时能保持接近原始音质的听感效果大幅降低存储压力。AAC 的收益来自“在主观可接受音质下显著降低码率”而不是单纯追求压缩倍数。2.2 节省传输带宽在直播、点播、语音通信和远程监控中网络带宽通常是硬约束。AAC 压缩后可显著降低传输码率减少网络抖动带来的播放卡顿并提高多路并发时的系统承载能力。对于流媒体系统而言音频并不只是“附属数据”它的稳定性直接影响整体体验。2.3 在较低码率下保持较好音质AAC 相比更早期的 MP3在同等码率下通常能提供更好的主观音质这是它长期成为移动互联网音频主流格式的重要原因之一。其本质在于 AAC 使用了更先进的滤波器组、量化和熵编码机制并结合心理声学模型去掉听觉上不敏感的信息。2.4 适配嵌入式产品的功耗与资源约束嵌入式开发往往需要在以下约束中平衡MCU/SoC 主频有限SRAM/DDR 容量有限音频链路要求持续实时功耗预算严格可能还要与视频编码、网络传输、AI 算法共用资源。因此AAC 的意义不仅在于“压小文件”更在于为系统级资源分配创造空间。3. AAC 的核心特点与优势3.1 更高的压缩效率AAC 在相同听感目标下通常比 MP3 需要更低的码率。这也是它在流媒体、广播和移动端广泛普及的原因。3.2 更好的主观音质AAC 对中高频细节、瞬态信息和立体声场的保持通常优于早期格式尤其是在中低码率下优势更明显。3.3 支持多种编码工具AAC 不是只靠“量化压缩”在工作它通常会配合多个编码工具MDCT把时域信号变换到频域TNS时域噪声整形PNS感知噪声替代SBR高频重建PS参数化立体声Huffman 编码进一步减少比特冗余。3.4 兼容性强生态成熟AAC 已被广泛支持于MP4 / M4A 容器Android MediaCodecApple AudioToolbox / CoreAudio广播与流媒体系统各类软硬件播放器。4. AAC 标准谱系与常见规格4.1 AAC-LCLow ComplexityAAC-LC 是最常见的 AAC 配置特点是复杂度适中音质和兼容性平衡较好最适合中高码率音频几乎是“默认 AAC”代名词。适用场景本地录音视频文件音轨普通流媒体对兼容性要求高的嵌入式播放系统。4.2 HE-AACv1HE-AAC 在 AAC-LC 上增加了SBRSpectral Band Replication通过低频编码加高频重建方式在较低码率下仍然保持较好的听感。它特别适合带宽有限场景。适用场景网络广播中低码率音频直播对带宽敏感的移动端业务。4.3 HE-AAC v2HE-AAC v2 在 HE-AAC 基础上增加PSParametric Stereo进一步压缩立体声信息在超低码率立体声音频中效果更好。适用场景超低码率立体声流媒体带宽更紧张的移动网络环境。4.4 AAC-LDLow DelayAAC-LD 不是为“音乐文件压缩”设计的而是为实时通信设计的。其重点不再是压得多小而是尽量降低算法时延。研究资料表明AAC-LD 通过缩短帧长、减少 look-ahead 和削弱 bit reservoir可以把算法时延压缩到适合双向通话的范围。适用场景语音会议双向对讲音视频互动系统。4.5 AAC-ELDEnhanced Low DelayAAC-ELD 可以理解为 AAC-LD 的增强版进一步引入低时延 SBR 和更适合低时延场景的滤波器组。在较低码率下仍能保持较好通话质量。Fraunhofer 的资料中明确提到AAC-ELD 相比 AAC-LD 能在更低码率下保持高质量通信体验。适用场景高质量语音会议低时延互动直播音视频对讲系统。4.6 xHE-AACxHE-AAC 更偏向“现代流媒体工程方案”强调极宽的码率覆盖范围对语音和音乐都友好与自适应码率流媒体结合强制包含 MPEG-D DRC动态范围控制能力。适用场景自适应流媒体广播与OTT音频复杂终端生态的大规模内容分发。5. AAC 编码的基本原理AAC 编码流程大致如下PCM输入 ↓ 分帧 ↓ 加窗 ↓ MDCT频域变换 ↓ 心理声学分析 ↓ 量化与比特分配 ↓ 熵编码Huffman ↓ 封装为 AAC 比特流5.1 分帧AAC 是基于帧的编码体系。不同 profile 的帧长度不同AAC-LC通常 1024 个采样点AAC-LD / ELD通常 480 或 512 个采样点HE-AAC内部处理粒度还会更复杂。这意味着在嵌入式系统中采集线程、环形缓冲区和编码线程必须围绕“每帧样本数”设计否则就会引入额外缓存等待与不可控时延。5.2 频域变换AAC 通常使用MDCTModified Discrete Cosine Transform将时域信号映射到频域。频域表示更适合分析哪些频段“值得保留”哪些频段“可以近似”。MDCT 是 AAC 压缩的核心数学基础之一。5.3 心理声学模型AAC 会利用人耳的掩蔽效应强信号会掩蔽邻近频率的弱信号某些高频成分对主观听感贡献较小某些噪声在特定频段内不易被察觉。因此编码器不会平均对待所有频率成分而是把有限比特优先给“人耳更敏感”的部分。5.4 量化与比特分配编码器需要决定每个频带分多少比特哪些频带可以更粗量化是否启用 TNS/PNS 等工具在目标码率下怎样平衡失真与复杂度。5.5 熵编码与比特流封装量化后的频谱系数会通过 Huffman 编码进一步压缩然后打包成 AAC 原始数据块再依据不同封装方式输出为 ADTS、LATM/LOAS或写入 MP4 中。6. AAC 文件格式与封装形式AAC 编码后的数据本质上是按照 AAC 标准生成的压缩音频帧数据。但在实际使用中这些数据并不会总是以完全相同的形式保存或传输而是会根据场景的不同采用不同的封装方式。在工程中经常会听到下面几个概念AAC 裸流Raw AACADIFADTSLATM / LOASMP4 / M4A 中的 AAC很多初学者容易把它们混在一起。实际上它们的关系可以理解为AAC 是编码方式ADIF/ADTS/LATM/MP4 是 AAC 数据的组织或封装方式。也就是说AAC 解决的是“怎么压缩音频”而 ADIF、ADTS 等解决的是“压缩后的数据怎么存、怎么传”。6.1 AAC 裸流Raw AACAAC 裸流指的是仅包含 AAC 原始编码数据块的比特流不包含额外的文件头或传输头信息。它的特点是数据最精简只保留编码后的音频有效载荷如果没有额外的上下文信息解码器往往无法直接知道采样率、声道数、Profile 等参数更适合嵌入在其他容器或协议中使用。所以裸 AAC 一般不会单独拿来做通用文件分发而是常作为底层有效负载存在。6.2 ADIF 格式ADIF 的全称是Audio Data Interchange Format它是一种面向文件存储的 AAC 数据组织方式。ADIF 的特点是整个文件只有一个统一的头部头部中保存了 AAC 解码需要的重要信息音频数据紧跟在头部之后连续存放解码时通常需要从文件开头开始解析。这意味着 ADIF 更适合本地文件存储一次性完整读取的场景不强调随机接入和中途同步的系统。但它也有明显限制如果从流中间开始接收数据往往无法直接解码一旦文件前部损坏整个流的可解析性会受到影响不适合网络实时传输。所以ADIF 更偏“文件交换格式”不适合流媒体实时传输场景。6.3 ADTS 格式ADTS 的全称是Audio Data Transport Stream它是一种面向传输的 AAC 数据封装方式也是嵌入式音视频开发中最常见的 AAC 裸流封装形式之一。ADTS 的最大特点是每一帧 AAC 数据前面都会带一个 ADTS Header。也就是说ADTS 文件或数据流是由很多“ADTS Header AAC Raw Data”这样的结构连续组成的。它的优点非常明显每一帧都有同步信息可以从流中任意位置尝试同步非常适合边收边播适合网络传输、直播、TS 流、RTP 等实时场景调试时也更方便容易从码流中定位帧边界。这也是为什么在实际开发中我们经常会看到.aac文件其实就是ADTS 封装的 AAC 数据流。6.4 ADIF 与 ADTS 的区别ADIF 和 ADTS 的本质区别可以概括为对比项ADIFADTS头部数量整个文件只有一个头每一帧都有头适用场景文件存储流式传输是否支持中途加入不适合适合随机访问能力较弱较强容错性前部出错影响大单帧出错影响相对局部嵌入式开发常见程度较少很常见从嵌入式工程角度看做本地文件归档时可以使用更高层容器做实时传输、推流、抓包分析、边采边播时ADTS 更实用。6.5 LATM / LOAS除了 ADIF 和 ADTS在一些广播、数字电视和特定传输协议中还会见到LATM / LOAS这种封装方式。它们同样是 AAC 的传输封装方式但更多出现在数字广播MPEG-TS 相关系统某些专用流媒体协议。对于一般的嵌入式音视频开发入门来说最常接触的仍然是ADTS。因此在初期学习阶段重点掌握 ADTS 即可。6.6 MP4 / M4A 中的 AAC很多人看到.mp4或.m4a文件中是 AAC 音频就误以为它们等同于 ADIF 或 ADTS其实并不是。MP4 / M4A 属于容器格式AAC 只是其中的音频编码格式之一。也就是说AAC负责压缩音频MP4 / M4A负责把音频、视频、时间戳、索引等数据组织起来。在 MP4/M4A 中AAC 一般不会直接以 ADTS 形式存储而是通过容器中的配置信息描述编码参数。所以要区分两个层次编码格式AAC封装容器MP4/M4A/TS 等6.7 工程中的理解方式可以把几种形式简单理解为PCM 原始音频 ↓ AAC 编码 ↓ AAC 原始压缩帧 ├─ ADIF 封装单文件头 ├─ ADTS 封装每帧头 ├─ LATM/LOAS 封装 └─ 封入 MP4 / M4A / TS 等容器因此在实际开发里看到“AAC音频”你需要进一步问清楚两件事它的编码 Profile 是什么比如 AAC-LC、HE-AAC、AAC-LD。它是怎么封装的比如 ADTS、MP4、TS、LATM。只有把“编码”和“封装”分开理解后面分析码流、写头、做封装、调播放器时才不会混乱。7. ADIF 与 ADTS 详解在 AAC 的各种封装方式中ADIF 和 ADTS 是最基础、也最容易在学习阶段接触到的两种形式。其中ADTS 在嵌入式开发中尤为常见因此值得单独展开说明。7.1 ADIF 详解ADIFAudio Data Interchange Format是一种面向文件存储的 AAC 数据格式。它的核心特点是整个 AAC 文件只在最开始位置包含一个 ADIF Header后续紧跟连续的 AAC 音频数据。也就是说ADIF 的组织形式更接近ADIF Header AAC Data AAC Data AAC Data ...ADIF 的优点结构相对紧凑只保存一个头部不需要每帧重复保存控制信息。适合完整文件存储当文件是完整读取、完整解码时ADIF 是可行的。ADIF 的缺点必须从头开始解码如果只拿到中间的一段数据由于缺少前部头信息通常无法直接解码。不适合流式传输网络中途加入、丢包恢复、随机定位都不方便。鲁棒性较差头部一旦损坏后面整个数据流都可能无法正确解析。所以ADIF 更适合作为“静态文件交换格式”而不是“实时音频传输格式”。7.2 ADTS 详解ADTSAudio Data Transport Stream是 AAC 在流式传输中最常用的一种封装方式。ADTS 的结构可以表示为ADTS Header AAC Frame ADTS Header AAC Frame ADTS Header AAC Frame ...也就是说每一帧 AAC 原始数据前都有一个固定格式的 ADTS Header。这种设计带来几个明显优势1便于同步每帧头部中都包含同步字syncword解码器可以通过同步字快速找到帧边界。2适合流式传输因为每帧都是独立可识别的所以可以从中途开始接收可以较容易从错误中恢复更适合直播、推流、边采边播。3便于调试分析抓到一段 AAC 数据流时只要找0xFFF同步头就可以尝试定位帧结构因此 ADTS 对开发调试非常友好。这也是为什么在实际项目中我们经常把 AAC 编码器输出直接组织成 ADTS 流送给文件保存模块、推流模块或播放器测试。7.3 ADTS 帧结构一个完整的 ADTS 帧通常由两部分组成ADTS Header AAC Raw Data其中ADTS Header描述这一帧的参数和长度AAC Raw Data真正的 AAC 压缩音频数据。ADTS Header 通常长度为7 字节无 CRC9 字节有 CRC实际开发中大多数情况下使用的是7 字节头。7.4 ADTS Header 结构说明ADTS Header 可分为两部分固定头Fixed Header可变头Variable Header这种划分方式非常重要因为固定头中的很多字段在整段音频流里通常是不变的可变头中的一些字段会随着每一帧变化比如帧长度。7.5 ADTS Fixed Header固定头固定头主要描述 AAC 流的基本属性例如编码对象类型采样率声道数是否有 CRC常见字段如下字段位数含义syncword12同步字固定为0xFFFID1MPEG 标识layer2固定为00protection_absent1是否省略 CRC1 表示无 CRCprofile2AAC Profile 类型sampling_frequency_index4采样率索引private_bit1私有位channel_configuration3声道配置original/copy1原始/复制标志home1Home 标志这些字段中最常需要关注的是1syncword固定为0xFFF这是解码器进行帧同步的关键标志。2profile用于表示 AAC 的对象类型常见值可理解为0Main1LC2SSR3保留在实际工程中最常见的是AAC-LC。3sampling_frequency_index它不是直接写采样率数值而是写一个索引值。常见关系如下索引值采样率0960001882002640003480004441005320006240007220508160009120001011025118000127350因此开发时如果采样率是 44100Hz那么这个字段写的不是44100而是索引值4。4channel_configuration用于标识声道布局常见值例如1单声道2双声道7.6 ADTS Variable Header可变头可变头中包含与当前帧更强相关的信息常见字段如下字段位数含义copyright_identification_bit1版权标识位copyright_identification_start1版权标识开始aac_frame_length13当前 AAC 帧总长度adts_buffer_fullness11缓冲区满度number_of_raw_data_blocks_in_frame2帧中原始数据块数量这里最重要的是1aac_frame_length表示当前完整 ADTS 帧的长度注意这里的长度包括ADTS Header 长度AAC Raw Data 长度也就是说aac_frame_length ADTS头长度 AAC数据长度如果这个字段写错播放器往往就无法正确切帧。2adts_buffer_fullness这个字段主要与码率控制和缓冲状态有关。很多 VBR 场景下经常看到特定默认值工程调试时通常不会首先关注它但做完整实现时仍要按规范填写。3number_of_raw_data_blocks_in_frame表示当前 ADTS 帧里包含几个 AAC Raw Data Block。通常最常见的是0它表示这一帧只包含1 个 AAC 原始数据块。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2469085.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!