AAC的各种规格

来源:互联网 发布:新郎礼服 知乎 编辑:程序博客网 时间:2024/04/30 20:50

Hi,又来写点儿小记录心得吧,这次是在准备AAC音频解码的规格中发现和总结出的一些问题,大概的情况在这里简要做一小记,为我们最后确立规格提供参考,当然我对AAC规格的了解还很稚嫩,有些表述不太确切的地方,还请大家指正:

 

一、规格(profile)问题

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

l         MPEG-2 AAC LC 低复杂度规格(Low Complexity--比较简单,没有增益控制,但提高了编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点

l         MPEG-2 AAC Main 主规格    

l         MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate

l         MPEG-4 AAC LC 低复杂度规格(Low Complexity------现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件

l         MPEG-4 AAC Main 主规格   ------包含了除增益控制之外的全部功能,其音质最好

l         MPEG-4 AAC SSR 可变采样率规格(Scaleable Sample Rate

l         MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition

l         MPEG-4 AAC LD 低延迟规格(Low Delay

l         MPEG-4 AAC HE 高效率规格(High Efficiency-----这种规格适合用于低码率编码,有Nero ACC 编码器支持

后来也看了14496-3标准,里面定义的profile除了上述的一些规格,还有如Scalable TwinVQ  CELP  HVXC等更多其他的profile

目前听到用的比较多的应该是LCHE(适合低码率)。流行的Nero AAC的命令行编码程序就支持LCHEHEv2这三种,试用后,用MediaInfo分析了编码后的AAC音频,发现规格显示都是LC,当时就感到奇怪,不是说支持三种规格吗?然后才又查资料发现,原来HE其实就是AACLC+SBR技术,HEv2就是AACLC+SBR+PS技术,难怪用MediaInfo分析后,HE规格的文件即显示:HE-AAC格式信息 ,哈哈,既然说到了这里,就再简单的说下HE吧:

HE:“high efficiency”(高效性)。HE-AAC v1(又称AACPlusV1SBR)用容器的方法加了原AACLC+SBR技术。呵呵,SBR其实代表的是Spectral Band Replication(频段复制)。简单概括一下,音乐的主要频谱集中在低频段,高频段幅度很小(但很重要,决定了音质),如果对整个频段编码,要么为了保护高频造成低频段编码过细以致文件巨大,要么为了保存了低频的主要成分而失去高频成分以致丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解了一对矛盾,真是聪明透顶啊~~

那么HEv2又是什么呢?这个好像更牛些,因为它用容器的方法包含了HE-AAC v1PS技术。PS指“parametric stereo”(参数立体声)。这个其实好理解,原来的立体声文件,文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方~怎么咱就没想到呢?

这样,HEv1HEv2用个图简单表示下就是:(图中的AAC即指的是原来的AAC-LC)

HE&HEv2

 

至此,对于HEHEv2 profileAAC序列我算是初步准备好了,但是由于NERO AAC编码后产生的是经过MP4容器封装后的,而我们的decoder需要处理的是未经封装的AAC流,因此还需要处理从MP4封装格式中extractAAC流的步骤;哦,这里提到了MP4容器封装,就再把我看到的一些关于MP4容器的心得插入在此也说下:

其实.mp4格式规范是MPEG4 Part 1标准定义的。但是这个格式本身相当通用,并不是只能用来存贮MPEG4视频格式。举个例子,一个.mp4文件中包含的可能是H.263的视频轨及AMR的音频轨。这样它和MPEG4视频压缩算法就半点边都沾不上。但它绝对是一个合法的.mp4文件。从这个意义上讲,.mp4是一个独立的封包格式。也许它的原始设计意图是仅用于MPEG4,但事实上大家觉得它很好用,已经把它扩展成可以包容其它格式了。现在市场上比如某产品号称“支持MP4播放”,到底是什么意思呢?如果它是指可以播放*.mp4这种文件,那里面的音频和视频格式它能支持多少种组合呢?没说清楚吧。举个极端的例子,假设一台设备仅支持“视频为未压缩YUV以及不带音频轨的.mp4文件,但它的文件名确实可以是*.mp4,是不是也可以在盒子上印上“支持MP4”呢?那么,买回去,复制一个网上下载的.mp4文件(MPEG4视频和AAC音频应该是个比较流行的组合),结果却发现根本不能播放。就算不举这么极端的例子,一般.mp4文件中常见的视频音频格式也有多种,一个产品要做到支持所有的格式是很难的。所以,如果要准确的描述,应该写清楚类似“支持视频格式为MPEG4H.264/AVC,音频为AMRAAC*.mp4文件”。其实更严格一些,还应该写清楚MPEG4支持到哪种profile, AMRNB还是WBAACLC还是HE等更多细节。当然,这种误导型的说明应该在减少,不过如果有比较确切的格式需求,最好还是先搞清楚这些细节。看到网上还有人说到N73,其实只支持视频为MPEG4 Simple Profile / Advanced Simple ProfileH.263 Profile 0 & 3,音频为AMR-NB/WB或者AAC-LC, HE-AACmp4文件。如果你放一个视频格式为H.264/AVCmp4上去,是无法播放出画面来的。呵呵,扯远了~~~。说得不准确的请大家指教。

好,回到刚才的要从MP4封装格式中extractAAC流的步骤,在网上找了一些工具,如MP4UI,MP4BOX,Yamb(mp4boxGUI程序),采用它们进行extract操作后发现,原来的SBRPS等信息咋没有了,都变成LC规格的AAC文件啦。好容易准备的测试流,难道还是不能用?于是一番苦寻发现,可能是SBRPS等信息在ADTS头中是无法体现的,所以分析ADTS格式头的AAC,就无法判别是否是HEHEv2啦。但是我总觉得SBRPS等技术信息在AAC流中应该还是存在的。因为我还在一个国外的论坛上看到这么几句话:There's no requirement for MP4 with AAC to have SBR indicated in the headers. It's still correct not to have it marked and have SBR or PS data in the stream anyway. Likewise, decoding a frame and not seeing any SBR or PS info doesn't mean you can't find it further up in the stream anyway(我理解就是说SBR OR PS信息不一定在Header中有,但是并不意味着你不能进一步在stream中发现它)。

昨天,又发现了一个新的地方,就是HE-AAC.mp4流,经过extractAAC(ADTS)后,44.1KHZ的变成了22.05KHZHEv2-AAC.mp4流,经过extractAAC(ADTS)后,不但44.1KHZ的变成了22.05KHZ(一半),连2channels也变成了1channels!啊,这个问题更奇怪了,在论坛上找,发现也有人有此问题:“I get 22050Hz, 1 channel for audio that is in fact 44100Hz, 2channels and having both SBR and PS”。

后来看到MSDN中的AAC Decoder的描述中有这么一小段话:

The media type gives the sample rate and number of channels prior to the application of spectral band replication (SBR) and parametric stereo (PS) tools, if present. The effect of the SBR tool is to double the decoded sample rate relative to the core AAC-LC sample rate. The effect of the PS tool is to decode stereo from a mono-channel core AAC-LC stream.

我的理解是AACdecoder如果支持SBRPS,会将AAC-HEV1(SBR)中的sample rate提高一倍,而会将AAC-HEV2(SBR+PS)中不仅sample rate提高一倍,单声道也提高至双声道了。结合前面提到的SBR(频段复制)PS(参数立体声)技术的简单介绍,好像觉得这样是有点儿道理的哦~~

IPP example提供的解码工具simple_player简单试了下,对于44.1khzstereoHEv2-AAC.mp4流,经过extract22.05KHZmono AAC(ADTS)后,再使用simple_player进行音频解码测试,解完后,果然发现又恢复了44.1khzstereo。(但目前也测试了好几种extract出的HEHEv2aac码流,有的能将sample ratechannel double回来,有的又不能,这个具体原因是不是由于Ipp example提供的解码器的问题还不确定)。

另外,用simple_player如果直接decoder编码出的经过封装的.mp4格式的AAC音频的话,发现:其它都正常,只AAC-HEv2格式的.mp4音频解码后变成了单声道。难道是解码器中的PS tools没能发挥作用?初步估计应该是IPP 的那个小解码器的问题吧。

以上是关于HEHEV2规格在学习过程中遇到的一些问题。

 

二、ADTS&ADIF

刚才上面说到了ADTS头格式的AAC。其实,AAC的音频文件格式有以下两种:

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

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

简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,具体的组织结构在这里就不详说了。

我们现在目前一般编码后的和抽取出的都是ADTS格式的。

 

三、其他规格

对于那9种规格,目前使用上述的NERO AAC提供的命令行编码工具可以得到LC,HEHEv2的,只是需要再从MP4封包中extract出来。剩下的其他profile目前我使用FAAC,(最终选取使用nero burning Rom 6FAAC插件),可以编码得到除MPEG-4 AAC HEMPEG-4 AAC LC两种以外的其他规格了,且通过一些选项,可以直接输出不带MP4封装格式的ADTSAAC文件。至此,实际上,9种规格中,除了MPEG-4 AAC LD没能准备外,其他规格初步算是可以准备好了。

说了这么多,估计也看烦了,最后我们再来看IPP example中提供的关于AAC decoder的文档说明:

The decoder supports the following features:

Low Complexity Profile (AAC_LC) is implemented.

Long Term Prediction Profile (AAC_LTP) is implemented

Main Profile (AAC_MAIN) is implemented

Scalable Sampling Rate Profile (AAC_SSR) is implemented

MPEG-4 SBR (Spectral Band Replication) extension is implemented   //不就是支持HE

PS (Parametric stereo) is implemented  //不就是支持HEv2

IS, MS, TNS, PNS tools are supported   //Intensity Stereo,简称IS)和Mid/Side (M/S) stereo 都是应该指联合立体声技术,简单的说,联合立体声的是对原来的取样进行的一定的渲染工作,使声音更好听些。时域噪音修整(Temporal Noise ShapingTNS):这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!知觉噪音代替(Perceptual Noise SubstitutionPNS):这也是MPEG4 AAC中才有的工具。

 ADIF, ADTS, MP4 formats are supported.

应该可以看出,IPP AAC DECODER提供对以上profile规格和ADIF, ADTS, MP4 formats的解码;

--by lydia

原创粉丝点击