转载:AAC文件解析及解码

Posted fellow_jing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载:AAC文件解析及解码相关的知识,希望对你有一定的参考价值。

 

转自:http://blog.csdn.net/wlsfling/article/details/5876016

http://www.cnblogs.com/gaozehua/archive/2012/05/03/2479960.html

http://blog.chinaunix.net/uid-26084833-id-3416600.html

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

 

Took Name

Main

LC

SSR

Noiseless

coding

Used

Used

Quantizer

Used

Used

Used

M/S

Used

Used

Used

Prediction

Used

Not

Use

Intersity/Coupling

Used

Not

Use

TNS

Used

Limited

Limited

Filter

Bank

Used

Used

Gain

Control

Not

Use

       

      目前使用最多的是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的一般格式见下图:

其中Raw_data_block为aac的raw data部分,其他部分为header和error check(error check是optional)。Raw_data_block格式如下,id_syn_ele:3位标志位,指示后面所跟着的数据流的类型。

  在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,动态范围控制信息等。

 

id_syn_ele

数据流

ID_SCE(0x0)

single_channel_element()

ID_CPE(0x1)

channel_pair_element()

ID_CCE(0x2)

coupling_channel_element()

ID_LFE(0x3)

lfe_channel_element()

ID_DSE(0x4)

data_stream_element()

ID_PCE(0x5)

program_config_element()

ID_FIL(0x6)

fill_element()

ID_DSE,ID_PCE,ID_FIL所指示的流为扩展流或用户数据流,非核心算法区,故暂不提及。

而single_channel_element(),channel_pair_element(),coupling_channel_element(),lfe_channel_element()有如下类似的结构,

individual_channel_stream的核心数据格式如下:

 MPEG2 AAC 码流数据结构层次图

  

MPEG2 AAC规定1024个sample数据为一个frame,一个frame的sample从时域通过MDCT映射到频域时由于引入50%交叠,所以变成2048个频率。

如果是长块变换则一个frame只有一个window group,每个window group有一个window,每个window 有2048个频率。

如果是短块变换则可能有若个window group,每个window group可能有若干个window,但是所有window group的window个数加一起一定为8个,此时每个windows 有256个频率。

而每个windows又可以分为n个section(1≤n≤max_sfb(一个frame内最多的scalefactor band的个数)),每个section有若干个频率数据(spectral data),但注意,section的边界必须和scalefactor band的边界重合,所以也可以说每个section有若干个scalefactor band。

提出section的意义在于统一个section的频率数据(spectral data)使用同一个huffman table编码。

对于编码来说,以window为单位取时域数据进行MDCT,得到频率数据。通过频率分布状况,分为几个section,每个section使用同一个huffman 码本。在每个section内又根据人耳特性分成各个频率范围(scalefactor band),.一个scalefactor band对应一个scalefactor.

比如1024个sample,转换到频域为1024个频率点,其范围为0~fs.通过人耳特性(http://blog.csdn.net/ssdzdk/article/details/40373311),将0~fs分为N个频率范围。如果N个频率范围相邻的几个频率范围中,频率数据赋值波动较小,则进行合并,一次合并的范围称为scalefactor band,一个scalefactor band对应一个scalefactor(scalefactor即为非均匀量化时使用的scale。比如要将0~fs量化到某个范围,每个scalefactor band内的频率幅值需要除以不同的scale).相邻几个scalefactor band内如果频率数据幅值波动较小,则又可以合并,一次合并后的子带可以使用同一个huffman code book.

MPEG2 AAC提出的window group和section的个数都是不定的,所以编码端要在比特流中加入相关的side info用来指示window group和section分割方法。在isc_info()中的scale_factor_grouping和section_data()中的sect_len_incr就是起到这样的作用.

     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文件处理流程

       (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)(https://en.wikipedia.org/wiki/Joint_(audio_engineering))

Joint stereo

The term joint stereo has become prominent as the Internet has allowed for the transfer of relatively low bit rate, acceptable-quality audio with modest Internet access speeds. Joint stereo refers to any number of encoding techniques used for this purpose. Two forms are described here, both of which are implemented in various ways with different codecs, such as MP3AAC and Ogg Vorbis.

Intensity stereo coding

This form of joint stereo uses a technique known as joint frequency encoding, which functions on the principle of sound localization. Human hearing is predominantly less acute at perceiving the direction of certain audio frequencies. By exploiting this characteristic, intensity stereo coding can reduce the data rate of an audio stream with little or no perceived change in apparent quality.

More specifically, the dominance of inter-aural time differences (ITD) for sound localization by humans is only present for lower frequencies. That leaves inter-aural amplitude differences (IAD) as the dominant location indicator for higher frequencies. The idea of intensity stereo coding is to merge the lower spectrum into just one channel (thus reducing overall differences between channels) and to transmit a little side information about how to pan certain frequency regions to recover the IAD cues.

This type of coding does not perfectly reconstruct the original audio because of the loss of information which results in the simplification of the stereo image and can produce perceptible compression artifacts. However, for very low bit rates this type of coding usually yields a gain in perceived quality of the audio. It is supported by many audio compression formats (including MP3AAC and Vorbis) but not always by every encoder.

M/S stereo coding

M/S stereo coding transforms the left and right channels into a mid channel and a side channel. The mid channel is the sum of the left and right channels, or {\\displaystyle M=L+R}M=L+R. The side channel is the difference of the left and right channels, or {\\displaystyle S=L-R}S=L-R. Unlike intensity stereo coding, M/S coding is a special case of transform coding, and retains the audio perfectly without introducing artifacts. Lossless codecs such as FLAC or Monkey\'s Audio use M/S stereo coding because of this characteristic.

To reconstruct the original signal, the channels are either added {\\displaystyle L={\\frac {M+S}{2}}}L={\\frac  {M+S}{2}} or subtracted {\\displaystyle R={\\frac {M-S}{2}}}R={\\frac  {M-S}{2}}

This form of coding is also sometimes known as matrix stereo and is used in many different forms of audio processing and recording equipment. It is not limited to digital systems and can even be created with passive audio transformers or analog amplifiers. One example of the use of M/S stereo is in FM stereo broadcasting, where {\\displaystyle L+R}L+R modulates the carrier wave and {\\displaystyle L-R}L-R modulates a subcarrier. Another example of M/S stereo is the stereophonic microgroove record. Lateral motions of a stylus represent the sum of two channels and the vertical motion represents the difference between the channels.

           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 频段复制

 

以上是关于转载:AAC文件解析及解码的主要内容,如果未能解决你的问题,请参考以下文章

直播-拉流和推流概述 转载

mp4文件格式解析(转载)

简单学习一下ibd数据文件解析

AAC_LC用LATM封装header信息解析

简单学习一下ibd数据文件解析

ffmpeg编码aac文件通过extradata添加adts头