AAC 文件解析及解码流程

OUTLINE

          AAC概述

          AAC规格简述

          AAC特点    

          AAC音频文件解析

            ——ADIF&ADTS格式

            ——ADIF&ADTS头信息

            ——ADIF&ADTS数据信息

            ——AAC文件处理流程

          AAC解码流程

            ——技术解析

         * 术语说明

 

 一.AAC概述

 

    AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的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 编码器支持

       

      目前使用最多的是LC和HE(适合低码率)。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+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 v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。

 

三、AAC特点

 

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

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

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

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

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

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

 

四、AAC音频文件格式

 

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

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

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

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

      AAC的ADIF格式见下图:

      

  

      AAC的ADTS的一般格式见下图:

     

         

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

  

     2. ADIF和ADTS的header

        ADIF 的头信息:

 

       

   

 

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

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

 

      

     ADTS 的固定头信息:

    

     

 

     ADTS的可变头信息:

   

    

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

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

           

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

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

 

       3.AAC元素信息

            

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

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

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

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

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

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

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

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

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

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

            ADIF 头部信息中。

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

 

       4.AAC文件处理流程

       (1) 判断文件格式,确定为ADIF或ADTS

       (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芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音。

 

         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版本

MPEG:Motion Picture Expert Group

IMDCT:反离散余弦变换

ADIF:Audio Data Interchange Format 音频数据交换格式

ADTS:Audio 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 瞬时噪声整形

ch:channel 通道

PS:parametric stereo 参数立体声

SBR:Spectral Band Replication 频段复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280188.shtml

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

相关文章

IntelliJ IDEA代码分屏显示

转载于:https://www.cnblogs.com/EasonJim/p/9124809.html

vscode重置应用程序_如何在Windows 10上重置应用程序的数据

vscode重置应用程序With Windows 10’s Anniversary Update, you can now reset an app’s data without actually uninstalling and reinstalling the app. This can fix problems when an app has gotten into a bad state, or just quickly restore an app to its default s…

程序报错与提示

2019独角兽企业重金招聘Python工程师标准>>> 我们在开发中, 为了程序的规范性,把报错级别,调的比较高NOTICE级别的也报出来,有助于我们快速定位错误和代码规范&#xff0c;但是,在产品上线后,网站运营过程中,就不宜报这么多错. 1:这种错误给客户的印象不好 2:在报错…

dock怎么自定义_如何自定义和调整Mac的Dock

dock怎么自定义The macOS dock normally appears at the bottom of your screen, but it doesn’t have to. The dock is customizable in quite a few ways you might not be aware of, especially if you’re a new Mac user. macOS坞站通常显示在屏幕底部&#xff0c;但不是…

ios 轻扫手势_轻扫即可快速删除iOS计算器中的数字

ios 轻扫手势iOS’ built-in calculator is a basic, simple-to-use calculator that’s very handy for doing some quick calculations, such as calculating the tip on your restaurant bill. It’s also useful for longer, more complicated calculations. However, ther…

游戏安全资讯精选 2017年第十期 英国彩票网遭遇DDoS攻击,中断90分钟 DNSMASQ多高危漏洞公告 阿里云协助警方破获国内最大黑客攻击案,攻击峰值690G...

【本周游戏行业DDoS攻击态势】 国庆期间&#xff0c;针对游戏行业的DDoS攻击放缓&#xff0c;攻击者也在放“小长假”&#xff0c;10月8日超过500G的攻击可视作攻击猛烈度恢复的表现。 【游戏安全动态】 英国彩票网遭遇DDoS攻击&#xff0c;中断90分钟 点击查看原文 点评&#…

02 jmeter 简单发送http请求

一、新建http请求模板1、测试计划2、右键Threads(users)-线程组3、右键sample-http请求4、右键监听器-查看结果树5、右键监听器-查看聚合报告二、编辑http请求内容三、设置并发用户1&#xff1a;虚拟用户数&#xff1b; 2&#xff1a;加载用户时间&#xff1b;3、每个用户循环次…

java调用siri 语言_如何更改Siri的声音,口音,性别和语言

java调用siri 语言Most of us are familiar with Siri as an American female voice. What you may not realize is that you can actually change Siri to have a different accent, gender, and language. 我们大多数人都熟悉Siri&#xff0c;这是一种美国女性声音。 您可能没…

mac word 设置语言_如何更改Mac的语言和区域设置

mac word 设置语言If you want to use your Mac in a different language, or you’re live in a different region, then you can change it in OS X. When you do, it’ll display everything in your preferred language, currency, date format, and more. 如果您想以其他语…

飞利浦dicom_如何按计划打开或关闭飞利浦色相灯

飞利浦dicomThe Philips Hue app can do a handful of cool stuff with your Hue lights, including the ability to schedule your lights to turn on and off at specific times throughout the day. Here’s how to set it up so that you never have to flip a switch ever…

Mono生命周期小实验

今天在写代码的时候&#xff0c;遇到一个初始化顺序问题&#xff0c;于是做了一个实验&#xff0c;下面记录结果&#xff1a; 情景&#xff1a; 1.在 脚本A中实例化 一个预制体&#xff0c;该预制体挂有脚本B 2.在 脚本A中&#xff0c;获取实例化物体 身上的 脚本B&#xff0c;…

[读书笔记]大型分布式网站架构设计与实践.分布式缓存

前言&#xff1a;本书是对分布式系统架构涉及到的相关技术的一本科普书籍。由于很难作为开发参考&#xff0c;只能但求了解。所以通篇浅读&#xff0c;对分布式系统进行大致的了解。因为写的非常好&#xff0c;感觉非常有意思&#xff0c;自己也做不出总结。所谓的读书笔记也就…

宁波保哥后院_如何抛出终极后院电影之夜

宁波保哥后院Most people have the basics of throwing a movie night down: you get a movie, you get snacks, you get comfortable, and boom, you’re done. When it comes to throwing a movie party in the backyard, however, things get a little trickier. Read on as…

大厂前端高频面试问题与答案精选

近日&#xff0c;GitHub上一位名为木易杨&#xff08;yygmind&#xff09;的开发者&#xff0c;在 GitHub 中建了一个名为Advanced-Frontend/Daily-Interview-Question项目&#xff0c;该项目每天会更新一道前端大厂面试题&#xff0c;并邀请开发者在issue区中作答&#xff0c;…

OpenLayers学习笔记5——使用jQuery UI实现查询并标注(UI篇)

近期事情非常多&#xff0c;老板给的压力也非常大。经常出差&#xff0c;另外项目和个人研究还都要跟上&#xff0c;本月要交论文&#xff0c;还要写专利&#xff0c;仅仅能抽时间来学习其它的东西了。 关于OpenLayers的在博客中不会写太多详细的实现&#xff08;网上有非常多o…

spring cloud config将配置存储在数据库中

转载请标明出处&#xff1a; https://blog.csdn.net/forezp/...本文出自方志朋的博客 Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓库&#xff0c;放在本地是将将所有的配置文件统一写在Config Server工程目录下&#xff0c;如果需要修改配置&#xff0…

初步解决博客园代码高亮的一个方案

今天我要推荐的是一个免费而且支持markdown语法的软件——Typora 它有很多优点&#xff0c;支持多种类型代码的高亮风格&#xff0c;方便的排版处理&#xff0c;支持Latex等&#xff0c;最重要的一点是真正做到了所见即所得ヽ(&#xff9f;∀&#xff9f;)&#xff92;(&#x…

git工作原理

工作区&#xff1a;就是你在电脑里能看到的目录。暂存区&#xff1a;英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时也叫作索引&#xff08;index&#xff09;。版本库&#xf…

【前端基础进阶】JS-Object 功能详解

Object.assign(target,source1,source2,...)该方法主要用于对象的合并&#xff0c;将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性&#xff0c;不拷贝继承的属性。Object.assign方法实行的是浅拷贝&#xff0c;而不是深拷贝。也就是说&am…

网页下载Google Play 的App

网页下载Google Play 的App 文章目录[点击展开](?)[] 前言 当你想在google play上下载某个应用&#xff0c;而无奈手机的系统并没有安装google servicess&#xff0c;此刻是否有些捉急&#xff1f; 本文分享的是一个网站&#xff0c;它可以无需手机而直接通过网页下载Google P…