AAC 文件解析及解码流程

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。

OUTLINE

          AAC概述

          AAC规格简述

          AAC特点    

          AAC音频文件解析

            ——ADIFADTS格式

            ——ADIFADTS头信息

            ——ADIFADTS数据信息

            ——AAC文件处理流程

          AAC解码流程

            ——技术解析

         * 术语说明

 

 .AAC概述

 

    AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IISDolby LaboratoriesAT&TSony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBRPS特性的AAC又称为MPEG-4 AAC

    AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>=80Kbps)HE-AAC(相当于AAC+SBR)主要用于中低码(<=80Kbps),而新近推出的HE-AACv2(相当于AAC+SBR+PS)主要用于低码率(<=48Kbps,事实上大部分编码器设成<=48Kbps自动启用PS技术,而>48Kbps就不加PS,就相当于普通的HE-AAC

 

二、AAC规格简述

 

      AAC共有9种规格,以适应不同的场合的需要:

       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 编码器支持

       

      目前使用最多的是LCHE(适合低码率)。流行的Nero AAC编码程序只支持LCHEHEv2这三种规格,编码后的AAC音频,规格显示都是LCHE其实就是AACLC+SBR技术,HEv2就是AACLC+SBR+PS技术;

   

 

              Hev1和HEv2用此图简单表示:

            (图中AAC即指的是原来的AAC-LC) 

 

      HE:“High Efficiency”(高效性)。HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,统筹兼顾了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。

 

      HEv2用容器的方法包含了HE-AAC v1PS技术。PS“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。

 

三、AAC特点

 

       (1)AAC是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法,

 AC-3MP3等。并且其质量可以同未压缩的CD音质相媲美。

       (2)同其他类似的音频编码算法一样,AAC也是采用了变换编码算法,但AAC使用了分辨率

 更高的滤波器组,因此它可以达到更高的压缩比。
      (3)AAC
使用了临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码等最新技术,这些新技术的使用都使压缩比得到进一步的提高。

     4)AAC支持更多种采样率和比特率、支持1个到48个音轨、支持多达15个低频音轨、具有

多种语言的兼容能力、还有多达15个内嵌数据流。
     
5AAC支持更宽的声音频率范围,最高可达到96kHz,最低可达8KHz,远宽于MP316KHz-48kHz的范围。
     
6)不同于MP3WMAAAC几乎不损失声音频率中的甚高、甚低频率成分,并且比WMA在频谱结构上更接近于原始音频,因而声音的保真度更好。专业评测中表明,AACWMA声音更清晰,而且更接近原音。 
     
7AAC采用优化的算法达到了更高的解码效率,解码时只需较少的处理能力。

 

四、AAC音频文件格式

 

      1. AAC的音频文件格式有ADIF  ADTS

       ADIFAudio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。

       ADTSAudio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

       简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。两者具体的组织结构如下所示:

      AACADIF格式见下图:

      

  

      AACADTS的一般格式见下图:

     

         

      图中表示出了ADTS一帧的简明结构,其两边的空白矩形表示一帧前后的数据。

  

     2. ADIFADTSheader

        ADIF 的头信息:

 

       

   

 

  ADIF头信息位于AAC文件的起始处,接下来就是连续的 raw data blocks

     组成ADIF头信息的各个域如下所示:

 

      

     ADTS 的固定头信息:

    

     

 

     ADTS的可变头信息:

   

    

1)帧同步目的在于找出帧头在比特流中的位置,13818-7规定,aac ADTS格式的帧头

             同步字为12比特的“1111 1111 1111”.

           

      2ADTS的头信息为两部分组成,其一为固定头信息,紧接着是可变头信息。固定头信息中

           的数据每一帧都相同,而可变头信息则在帧与帧之间可变。

 

       3.AAC元素信息

            

       AAC中,原始数据块的组成可能有六种不同的元素:

       SCE: Single Channel Element单通道元素。单通道元素基本上只由一个ICS组成。一个

           原始数据块最可能由16SCE组成。

       CPE: Channel Pair Element 双通道元素,由两个可能共享边信息的ICS和一些联合立体

            声编码信息组成。一个原始数据块最多可能由16SCE组成。

       CCE: Coupling Channel Element 藕合通道元素。代表一个块的多通道联合立体声信息

           或者多语种程序的对话信息。

       LFE: Low Frequency Element 低频元素。包含了一个加强低采样频率的通道。

       DSE: Data Stream Element 数据流元素,包含了一些并不属于音频的附加信息。

       PCE: Program Config Element 程序配置元素。包含了声道的配置信息。它可能出现在

            ADIF 头部信息中。

       FIL: Fill Element 填充元素。包含了一些扩展信息。如SBR,动态范围控制信息等。

 

       4.AAC文件处理流程

       (1) 判断文件格式,确定为ADIFADTS

       (2) 若为ADIF,解ADIF头信息,跳至第6步。

       (3) 若为ADTS,寻找同步头。

       (4)ADTS帧头信息。

       (5)若有错误检测,进行错误检测。

       (6)解块信息。

       (7)解元素信息。

 

五、AAC解码流程

  

 AAC解码流程图)

      

       在主控模块开始运行后,主控模块将AAC比特流的一部分放入输入缓冲区,通过查找同步字

   得到一帧的起始,找到后,根据ISO/IEC 13818-7所述的语法开始进行Noisless Decoding(

   噪解码),无噪解码实际上就是哈夫曼解码,通过反量化(Dequantize)、联合立体声(Joint

   Stereo),知觉噪声替换(PNS,瞬时噪声整形(TNS),反离散余弦变换(IMDCT),频段复制 

 SBR)这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到

  声音播放设备。

      

     技术解析:

         1.主控模块:

         所谓的主控模块,它的主要任务是操作输入输出缓冲区,调用其它各模块协同工作。

     其中,输入输出缓冲区均由DSP控制模块提供接口。输出缓冲区中将存放的数据为解码出来的

     PCM数据,代表了声音的振幅。它由一块固定长度的缓冲区构成,通过调用DSP控制模块的接  

     口函数,得到头指针,在完成输出缓冲区的填充后,调用中断处理输出至I2S接口所连接的

     音频ADC芯片(立体声音频DACDirectDrive耳机放大器)输出模拟声音。

 

         2.Noisless Decoding(无噪解码)

         无噪编码就是哈夫曼编码,它的作用在于进一步减少尺度因子和量化后频谱的冗余,

     即将尺度因子和量化后的频谱信息进行哈夫曼编码。全局增益编码成一个8位的无符号整数,

     第一个尺度因子与全局增益值进行差分编码后再使用尺度因子编码表进行哈夫曼编码。后续

     的各尺度因子都与前一个尺度因子进行差分编码。量化频谱的无噪编码有两个频谱系数的划分。     其一为4元组和2元组的划分,另一个为节划分。对前一个划分来说,确定了一次哈夫曼表

     查找出的数值是4个还是2个。对后一个划分来说,确定了应该用哪一个哈夫曼表,一节中

     含有若干的尺度因子带并且每节只用一个哈夫曼表。

         ——分段

         无噪声编码将输入的1024个量化频谱系数分为几个段(section),段内的各点均使用

     同一个哈夫曼表,考虑到编码效率,每一段的边界最好同尺度因子带的边界重合。所以每一段

     必段传送信息应该有:段长度,所在的尺度因子带,使用的哈夫曼表。

         ——分组和交替

         分组是指忽略频谱系数所在窗,将连续的,具有相同尺度因子带的频谱系数分为一组放在

     一起,共享一个尺度因子从而得到更好的编码效率。这样做必然会引起交替,即本来是以

    c[][][尺度因子带][ 系数索引]

    为顺序的系数排列,变为将尺度因子带同的系数放在一起:

    c[][尺度因子带][][ 系数索引]

    这样就引起了相同窗的系数的交替。

        ——大量化值的处理

        大量化值在AAC中有两种处理方法:在哈夫曼编码表中使用escape标志或使用脉冲

    escape方法。前者跟mp3编码方法相似,在许多大量化值出现时采用专门的哈夫曼表,这个表

    暗示了它的使用将会在哈夫曼编码后面跟跟一对escape值及对值的符号。在用脉冲escape

    方法时,大数值被减去一个差值变为小数值,然后使用哈夫曼表编码,后面会跟一个脉冲结构

    来帮助差值的还原.

   

           3.尺度因子解码及逆量化

      AAC编码中,逆量化频谱系数是由一个非均匀量化器来实现的,在解码中需进行其逆运算。      即保持符号并进行4/3次幂运算。

      在频域调整量化噪声的基本方法就是用尺度因子来进行噪声整形。尺度因子就是一个用来改

      变在一个尺度因子带的所有的频谱系数的振幅增益值。使用尺度因子这种机制是为了使用非

      均匀量化器在频域中改变量化噪声的比特分配。

              ——尺度因子带(scalefactor-band

      频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度

      因子带。为了减少信息含有短窗的边信息,连续的短窗可能会被分为一组,即将若干个短窗

      当成一个窗口一起传送,然后尺度因子将会作用到所有分组后的窗口去。

           4.联合立体声(Joint  Stereo)

           联合立体声的是对原来的取样进行的一定的渲染工作,使声音更好听些。

           5.知觉噪声替换(PNS

           知觉噪声替换模块是一种以参数编码的方式模拟噪声的模块。在判别出音频值中的噪

      声后,将些噪声不进行量化编码,而是采用一些参数告诉解码器端这是某种噪声,然后解

      码器端将会对这些噪声用一些随机的编码来制造出这一类型的噪声。

           在具体操作上,PNS模块对每个尺度因子带侦测频率4kHz以下的信号成分。如果这个

      信号既不是音调,在时间上也无强烈的能量变动,就被认为是噪声信号。其信号的音调及能

      量变化都在心理声学模型中算出。

           在解码中,如果发现使用了哈夫曼表13(NOISE_HCB),则表明使用了PNS。由于M/S立体

      声解码与PNS解码互斥,故可以用参数ms_used来表明是否两个声道都用同样的PNS。如果 

      ms_used参数为1,则两个声道会用同样的随机向量来生成噪声信号。PNS的能量信号用

      noise_nrg来表示,如果使用了PNS,则能量信号将会代替各自的尺度因子来传送。噪声能量

     编码同尺度因子一样,采用差分编码的方式。第一个值同样为全局增益值。它同强度立体声位

     置值及尺度因子交替地放在一起,但对差分解码来说又彼此忽略。即下一个噪声能量值以上一

     个噪声能量值而不是强度立体声位置或尺度因子为标准差分解码。随机能量将会在一个尺度

     因子带内产生noise_nrg所计算出的平均能量分布。此项技术只有在MPEG-4 AAC中才会使用。

           6.瞬时噪声整形(TNS

           这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一

     些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!

           TNS瞬态噪声整形用于控制一个转换窗口内的瞬时噪声形态。它是用一个对单个通道的

    滤波过程来实现的。传统的变换编码方案常常遇到信号在时域变化非常剧烈的问题,特别是语

    音信号,这个问题是因为量化后的噪声分布虽然在频率域上得到控制,但在时域上却以一个常

    数分布在一个转换块内。如果这种块中信号变化得很剧烈却又不转向一个短块去,那这个常数

    分布的噪声将会被听到。

          TNS的原理利用了时域和频域的二元性和LPC(线性预测编码)的时频对称性,即在其中的

    任意一个域上做编码与在另一域上做预测编码等效,也就是说,在一个域内做预测编码可以在

    另一域内增加其解析度。量化噪声产生是在频域产生的,降低了时域的解析度,故在这里是在

    频域上做预测编码。在AACplus中,由于基于AAC profile LC,故TNS的滤波器阶数被限制在 

    12阶以内。

           7.反离散余弦变换(IMDCT

          将音频数据从频域转换到时域的过程主要是由将频域数据填入一组IMDCT滤波器来实现

    的。在进行IMDCT变换后,输出数值经过加窗,叠加,最后得到时域数值。

           8.频段复制(SBR

           简要叙述,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了

    音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是    

    保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存

    主要成分,高频单独放大编码保存音质,统筹兼顾了,在减少文件大小的情况下还保存了

    音质,完美的化解这一矛盾。

           9.参数立体声(PS

           对于之前的立体声文件来说,其文件大小是单声道的两倍,但是两个声道的声音存在

    某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术

    存储了一个声道的全部信息,之后,用很少的字节当作参数来描述另一个声道和它不同的地方。

 

 

 

 

  

术语说明:

AAC: Advanced Audio Coding 高级音频编码

AAC LC: AAC with Low Complexity AAC的低复杂度配置

AAC plus: 也叫HE-AAC, AAC+,MPEG4 AAC LC加入SBR模块后形成的一个AAC版本

MPEGMotion Picture Expert Group

IMDCT:反离散余弦变换

ADIFAudio Data Interchange Format 音频数据交换格式

ADTSAudio Data Transport Stream 音频数据传输流

SCE: Single Channel Element单通道元素

CPE: Channel Pair Element 双通道元素

CCE: Coupling Channel Element 藕合通道元素

DSE: Data Stream Element 数据流元素

PCE: Program Config Element 程序配置元素

FIL: Fill Element 填充元素

ICS: Individual Channel Stream 独立通道流

PNS: Perceptual Noise Substitution 知觉噪声替换

SBR: Spectral Band Replication 频段复制

TNS: Temporal Noise Shaping 瞬时噪声整形

chchannel 通道

PSparametric stereo 参数立体声

SBRSpectral Band Replication 频段复制

目录
相关文章
|
6天前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
141 11
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
2月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
491 2
|
2月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
516 0
|
9天前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
27天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
54 12
|
2月前
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
501 60
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
42 3
|
1月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
2月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。

推荐镜像

更多