AAC的各种规格
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。
目前听到用的比较多的应该是LC和HE(适合低码率)。流行的Nero AAC的命令行编码程序就支持LC,HE,HEv2这三种,试用后,用MediaInfo分析了编码后的AAC音频,发现规格显示都是LC,当时就感到奇怪,不是说支持三种规格吗?然后才又查资料发现,原来HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术,难怪用MediaInfo分析后,HE规格的文件即显示:LC(SBR),哈哈,既然说到了这里,就再简单的说下HE吧:
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技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方~怎么咱就没想到呢?
这样,HEv1和HEv2用个图简单表示下就是:(图中的AAC即指的是原来的AAC-LC)
至此,对于HE和HEv2 profile的AAC序列我算是初步准备好了,但是由于NERO AAC编码后产生的是经过MP4容器封装后的,而我们的decoder需要处理的是未经封装的AAC流,因此还需要处理从MP4封装格式中extract出AAC流的步骤;哦,这里提到了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文件中常见的视频音频格式也有多种,一个产品要做到支持所有的格式是很难的。所以,如果要准确的描述,应该写清楚类似“支持视频格式为MPEG4或H.264/AVC,音频为AMR或AAC的*.mp4文件”。其实更严格一些,还应该写清楚MPEG4支持到哪种profile, AMR是NB还是WB,AAC是LC还是HE等更多细节。当然,这种误导型的说明应该在减少,不过如果有比较确切的格式需求,最好还是先搞清楚这些细节。看到网上还有人说到N73,其实只支持视频为MPEG4 Simple Profile / Advanced Simple Profile及H.263 Profile 0 & 3,音频为AMR-NB/WB或者AAC-LC, HE-AAC的mp4文件。如果你放一个视频格式为H.264/AVC的mp4上去,是无法播放出画面来的。呵呵,扯远了~~~。说得不准确的请大家指教。
好,回到刚才的要从MP4封装格式中extract出AAC流的步骤,在网上找了一些工具,如MP4UI,MP4BOX,Yamb(mp4box的GUI程序),采用它们进行extract操作后发现,原来的SBR和PS等信息咋没有了,都变成LC规格的AAC文件啦。好容易准备的测试流,难道还是不能用?于是一番苦寻发现,可能是SBR和PS等信息在ADTS头中是无法体现的,所以分析ADTS格式头的AAC,就无法判别是否是HE和HEv2啦。但是我总觉得SBR和PS等技术信息在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码流,经过extract出AAC(ADTS)后,44.1KHZ的变成了22.05KHZ。HEv2-AAC的.mp4码流,经过extract出AAC(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.
我的理解是AAC的decoder如果支持SBR和PS,会将AAC-HEV1(SBR)中的sample rate提高一倍,而会将AAC-HEV2(SBR+PS)中不仅sample rate提高一倍,单声道也提高至双声道了。结合前面提到的SBR(频段复制)和PS(参数立体声)技术的简单介绍,好像觉得这样是有点儿道理的哦~~
用IPP example提供的解码工具simple_player简单试了下,对于44.1khz,stereo的HEv2-AAC的.mp4码流,经过extract出22.05KHZ,mono 的AAC(ADTS)后,再使用simple_player进行音频解码测试,解完后,果然发现又恢复了44.1khz和stereo。(但目前也测试了好几种extract出的HE和HEv2的aac码流,有的能将sample rate和channel 又double回来,有的又不能,这个具体原因是不是由于Ipp example提供的解码器的问题还不确定)。
另外,用simple_player如果直接decoder编码出的经过封装的.mp4格式的AAC音频的话,发现:其它都正常,只AAC-HEv2格式的.mp4音频解码后变成了单声道。难道是解码器中的PS tools没能发挥作用?初步估计应该是IPP 的那个小解码器的问题吧。
以上是关于HE和HEV2规格在学习过程中遇到的一些问题。
二、ADTS&ADIF
刚才上面说到了ADTS头格式的AAC。其实,AAC的音频文件格式有以下两种:
ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,具体的组织结构在这里就不详说了。
我们现在目前一般编码后的和抽取出的都是ADTS格式的。
三、其他规格
对于那9种规格,目前使用上述的NERO AAC提供的命令行编码工具可以得到LC,HE和HEv2的,只是需要再从MP4封包中extract出来。剩下的其他profile目前我使用FAAC,(最终选取使用nero burning Rom 6和FAAC插件),可以编码得到除MPEG-4 AAC HE和MPEG-4 AAC LC两种以外的其他规格了,且通过一些选项,可以直接输出不带MP4封装格式的ADTS的AAC文件。至此,实际上,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 Shaping,TNS):这项神奇的技术可以通过在频率域上的预测,来修整时域上的量化噪音的分布。在一些特殊的语音和剧烈变化信号的量化上,TNS技术对音质的提高贡献巨大!知觉噪音代替(Perceptual Noise Substitution,PNS):这也是MPEG-4 AAC中才有的工具。
ADIF, ADTS, MP4 formats are supported.
应该可以看出,IPP 的AAC DECODER提供对以上profile规格和ADIF, ADTS, MP4 formats的解码;
本文来自CSDN博客,出处:http://blog.csdn.net/AXDC_QA_Team/archive/2009/06/15/4271043.aspx