AAC编码详解

news2026/4/1 18:45:12
嵌入式音视频开发——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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…