1 文件格式
1.1 概述及分类
AAC“Advanced Audio Coding”的缩写,中文称为“高级音频编码”,被手机界称为“21世纪数据压缩方式”,AAC所采用的运算方式是与MP3的运算有所不同,AAC同时可以支持多达48个音轨,15个低频音轨,更多种取样率和比特率与及有多种言语的兼容能力,更高的译码效率,总括来说,AAC可以在对比MP3文件缩小30%的前题下提供更好的音质。
AAC帧与帧之间编码完全独立,所以其广泛运用于流媒体。
由于对AAC有重要贡献的公司比较多,如Fraunhofer,Dolby, Sony和AT&T,导致AAC子格式多,很容易搞混。他们是共分为9种规格,以适应不同场合的需要:
a) MPEG-2 AAC LC 低复杂度规格 (Low Complexity)
b) MPEG-2 AAC Main 主规格
c) MPEG-2 AAC SSR 可变取样率规格 (Scaleable Sample Rate)
d) MPEG-4 AAC LC 低复杂度规格(Low Complexity),现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件
e) MPEG-4 AAC Main 主规格
f) MPEG-4 AAC SSR 可变取样率规格 (Scaleable Sample Rate)
g) MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition)
h) MPEG-4 AAC LD 低延迟规格(Low Delay)
i) MPEG-4 AAC HE 高效率规格(High Efficiency)(即AAC+,含SBR)
上述的规格中,主规格“Main”包含了除增益控制之外的全部功能,其音质是最好,而低复杂度规格则是比较简单,没有了增益控制,但提高了编码效率,至“SSR”对“LC”规格大体是相同,但是多了增益的控制功能,另外,MPEG- 4/AAC/LTP/LD/HE,都是用在低码率下编码,特别是“HE”是有Nero ACC编码器支持,是近来多用的一种编码率种,不过通常来说,Main规格和LC规格的音质相差是不大。
以上规格的划分是比较官方的分发,wiki上也是如此划分。事实上MPEG-4与MPEG-2 AAC流除了在文件头(header)上并没有什么区别。只是一些应用软件象QuickTime并不承认MPEG-2 AAC。Real的解码程序中,并未对这2种进行区分。所以从编解码来看,按如下划分更清晰:
a)LC profile:最简单的profile,苹果iTune使用这种格式(iTune也使用Apple LosslessAAC ,不过似乎没有划分到AAC家族中,一个文件通常上20M)。
b) MAIN profile: LC profile + 后向预测(backwards prediction)
c) SRS: sample-rate scalability,submitted by Sony and reportedly
d) LTP:long term prediction, main profile + forward prediction
e)HE-AAC: high efficiency AAC,又叫aacPlus,使用SBR,可能使用PS.AAC + SBR(Spectral Band Replication)aacPlusv1, AAC + SBR + PS(Parametric Stereo)aacPlus v2. 如图所示:
其中,aacPlus v1已被运动图像专家组MPEG指定为其标准MPEG-4 HE AAC.
1.2 AAC的编码器
a) FhG Fraunhofer IIS研发的权威编码器,拥有很好的音质,不对外开放。
b) Nero AAC可能是目前最完美的AAC编码器了,同时支持"LC AAC/HE AAC"规格,Nero AAC编码器提供了品质最好的"VBR LC AAC"格式,同时亦对面"HE AAC"规格保证了在低码率下也有良好的表现,千千静听 + Nero插件,就可以编码AAC文件了,我当初就这么做测试向量的,哈哈。
c) QuickTime/iTune Apple公司的两款Media软件都提供了AAC编码功能,其编码技术来自“DolbyLaboratories”,是目前音质最好的中码编率编码器,它编码的48kbps立体声音质比其它AAC编码器好20 - 25%,甚至64 kbps的Dolby AAC音效可媲美128 kbps的MP3。
d) FAAC:免费,开源,郑重推荐。
1.3 文件后缀名
用aac编码的文件可能使用这三种后缀名:aac,m4a,mp4.
AAC:以aac为后缀的文件无文件头,由一些列的帧组成文件,帧头分ADIF和ADTS两种。
M4A:用MP4作为container,这种MP4文件里面只有音频帧,无视频帧。由MP4文件头+一系列的帧组成,帧头比AAC为后缀的文件要短。所以在保持压缩数据不变的情况下,将AAC转为M4A,文件会小一些,因为每帧省几个字节,合起来省下的字节数通常比MP4文件头还大。
MP4:可以同时有视频帧和音频帧,也可以只有音频或视频帧。
注:在下面的1.5节中,会详细说一下AAC为后缀的文件格式,MP4 container的格式可以参照我的另一篇文章,MPEG4-Part14 -- MP4 file format。
1.4 编码工具推荐
FAAC 和 千千静听+nero插件
1.5 File format specification--以aac为后缀名的文件格式
AAC没有文件头,由帧序列组成。一共有2种格式的帧头,ADTS和ADIF。一个文件中通常不会2种帧共存,并且大多数AAC文件包含的帧为 ADTS。
ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。
//以下对文件格式说明使用的表格来自ISO-IEC-13818-7
1.5.1 ADIF
ADIF的帧序列按如下方式组成一个文件:
Table 2– Syntax of adif_sequence()
Syntax |
No. of bits |
Mnemonic |
adif_sequence() |
||
{ |
||
adif_header(); |
||
byte_alignment(); |
||
raw_data_stream(); |
||
} |
其中Header结构如下:
Table 3 – Syntax of adif_header()
Syntax |
No. of bits |
Mnemonic |
adif_header() |
||
{ |
||
adif_id; |
32 |
bslbf |
copyright_id_present; |
1 |
bslbf |
if (copyright_id_present) { |
||
copyright_id; |
72 |
bslbf |
} |
||
original_copy; |
1 |
bslbf |
home; |
1 |
bslbf |
bitstream_type; |
1 |
bslbf |
bitrate; |
23 |
uimsbf |
num_program_config_elements; |
4 |
bslbf |
if (bitstream_type == ‘0’) { |
||
adif_buffer_fullness; |
20 |
uimsbf |
} |
||
for (i = 0; i < num_program_config_elements + 1; i++) { |
||
program_config_element(); |
||
} |
||
} |
1.5.2 ADTS
ADTS文件有帧序列组成,如下表所示:
Table 4 – Syntax of adts_sequence()
Syntax |
No. of bits |
Mnemonic |
adts_sequence() |
||
{ |
||
while (nextbits() == syncword) { |
||
adts_frame(); |
||
} |
||
} |
每帧除去最前面的同步字后,结构如下:
Table 5 – Syntax of adts_frame()
Syntax |
No. of bits |
Mnemonic |
adts_frame() |
||
{ |
||
adts_fixed_header(); |
||
adts_variable_header(); |
||
if (number_of_raw_data_blocks_in_frame == 0) { |
||
adts_error_check(); |
||
raw_data_block(); |
||
} |
||
else { |
||
adts_header_error_check(); |
||
for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) { |
||
raw_data_block(); |
||
adts_raw_data_block_error_check(); |
||
} |
||
} |
||
} |
其中,ADTS头分两部分,固定头和可变头,固定头每帧一样,可变头帧与帧可以不同。
Table 8 – Syntax of adts_fixed_header()
Syntax |
No. of bits |
Mnemonic |
adts_fixed_header() |
||
{ |
||
syncword; |
12 |
bslbf |
ID; |
1 |
bslbf |
layer; |
2 |
uimsbf |
protection_absent; |
1 |
bslbf |
profile; |
2 |
uimsbf |
sampling_frequency_index; |
4 |
uimsbf |
private_bit; |
1 |
bslbf |
channel_configuration; |
3 |
uimsbf |
original/copy; |
1 |
bslbf |
home; |
1 |
bslbf |
} |
Table 9 – Syntax of adts_variable_header()
Syntax |
No. of bits |
Mnemonic |
adts_variable_header() |
||
{ |
||
copyright_identification_bit; |
1 |
bslbf |
copyright_identification_start; |
1 |
bslbf |
frame_length; |
13 |
bslbf |
adts_buffer_fullness; |
11 |
bslbf |
number_of_raw_data_blocks_in_frame; |
2 |
uimsfb |
} |
2 解码流程
to be continued....
相关推荐
由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的AAC又称为MPEG-4...
AAC编解码源码 AAC编解码源码 AAC编解码源码
一个效率很高的AAC编解码库 Fdk-aac相比 faac以及其他的aac库,好处是输出码率控制精准,而且支持he-aac的编解码
本Demo使用MediaCodec解码AAC音频数据,解码之后直接使用AudioTrack播放PCM音频数据
aac-ld 解码实例 , 基于fdk-aac库 支持aac-ld格式 单声道和双声道的立体声
包含三个aac音频解码器,Directshow Filter文件,需要用DirectShow解码AAC音频,试试这几个吧。
该资源为aac编码,文件格式为adts,7 bytes头部的白噪声。主要作用是针对我的博客https://blog.csdn.net/y3350020752/article/details/107447438,提供的音频白噪声数据。
一个使用faad库解码AAC的小程序,只能解码ADTS格式帧文件
iOS使用第三方库ffmpeg+fdk-aac进行编解码,包括音频和视频的编解码
Android利用MediaCodec硬解码H264,AAC文件并播放Demo。相关博客:http://blog.csdn.net/a512337862/article/details/72629755和http://blog.csdn.net/a512337862/article/details/72629755
AAC解码算法原理, AAC文件格式, ISO MPEG AAC相关文档, MP4数据流封装的标准文档
AAC格式音频测试文件,vlc可以直接播放
aac音频文件,用于测试编解码
aac音频压缩编解码源码 方便进行音频压缩,使用到mp4V2库,mp4av,mp4ff,这是包含SBR的最新AAC编解码算法
是一个Windows下使用FFMPEG解码AAC文件并使用SDL播放的简单例子 FFMPEG的版本是2.5.2 SDL的版本是2.04 关于代码的解释 请参考: http://blog.yundiantech.com/?log=blog&id=10
包含6个AAC文件(50KB~1000KB)、6个MP3文件(50KB~1000KB)
安卓aac解码播放
代码比较简单,MFC实现的,AAC文件,转PCM文件,转WAV文件,内附音频信息查看工具
实现在linux下使用libfaad库将aac文件解码成pcm。具体请看压缩包中的readme。
aac格式的音频文件,aac格式的音频文件,aac格式的音频文件