在众多音频压缩方法中,这些方法在保持声音质量的同时尽量压缩数字音频使之占用更小的存储空间。MPEG压缩是该领域中效果最好的一个。
这种压缩是有损压缩,这意味着,当运用这一方法压缩时肯定会丢失一部分音频信息。但是,由于压缩方法的控制很难发现这种损失。使用几个非常复杂和苛刻的数学算法,使得只有原始音频中几乎听不到的部分损失掉。这就给重要的信息剩下了更多的空间。通过这种方法可以将音频压缩12倍(可以选择压缩率),效果显著。正是应为他的质量,MPEG音频变得流行起来。
MPEG-1,MPEG-2和MPEG-4都是人们熟悉的MPEG标准,本文只涉及到了前两者。本文还涉及了一个广泛应用的非官方标准MPEG-2.5。
MPEG-1音频(ISO/IEC 11172-3)描述了具有如下属性的三层音频编码:
1或2个声道
采样频率为32kHz,44.1kHz或48kHz
波特率从32kbps到448kbps
每一层都有自己的优点。
MPEG-2音频(ISO/IEC 13818-3)有两个MPEG-1的扩展,通常叫做MPEG-2/LSF和MPEG-2/Multichannel
MPEG-2/LSF有如下特点:
1或2个声道
采样频率为MPEG-1的一半
波特率从8kbps256kbps
MPEG-2/Mutichannel有如下特点:
多达5个声道和1个LFE-通道(低频增强 不是重低音)
同MPEG-1一样的采样频率
5.1的最高波特率可能达到1Mbps
MPEG音频帧头
一个MPEG音频文件是许多的称为帧的较小部分组成的,通常,帧是独立的组成部分。每一帧都拥有自己的头和音频信息。没有文件头。所以,我们可以剪切MPEG文件的任何部分并且能够正常播放(当然要分割到帧的结束处尽管许多程序会处理错误头)。在LayerIII中就并不是100%正确的。这是因为在MPEG-1LayerIII文件中的数据组织中,帧常常是互相关联的并且不能那样随便裁切。
当你想读取MPEG文件的信息时,通常只找到第一帧就足够了,读取它的头信息然后假设其它帧是相同的就可以。但这也不是所有情况。变比特率的MPEG文件使用使用所谓比特变换,也就是说每一帧的比特率依照具体内容变化。这种方法没有减少声音质量的帧将应用较低的波特率。这样就允许更好的压缩质量的同时又保证了高质量的音质。
帧头由每一帧的前4个字节(32比特)组成。帧头的前11比特(或前12个比特,见下文关于帧同步)总是固定的称作“帧同步”。因此,可以在整个文件中查找第一个帧同步(即:必须找到一个值为255的且其后跟着三到四个最高位置位的字节。)然后读取整个头检查值是否正确。关于头中每一个比特的具体含义应该验证那一个值的有效性可以操看下面的表格,如果存在被定义为保留,无效,损坏或不允许的值表明该头已经损坏。记住,光有这些是不够的,帧同步能在许多二进制文件里面的应用是很广的。而且,MPEG文件可能在开头包含可能有错误同步信息的垃圾,所以我们必须检查两个或者更多一些帧来确定我们现在读取的文件是一个MPEG文件。
帧可能还是CRC校验。如果存在的话,CRC校验紧跟在帧头之后,长为16比特。CRC校验之后是音频数据。计算出帧长度,如果你需要读取其他头或者计算该帧的CRC值,可以使用它比较文件中读出来的帧。验证MPEG头的有效性这是一个非常好的方法。
下面是一个头内容图示,使用字符A到M表示不同的区域。在表格中你可以看到每一区域的详细内容。
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
符号i | 长度(bits) | 位置(bits) | 描述 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A | 11 | (31-21) | 帧同步(所有位置位) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B | 2 | (20,19) | MPEG 音频版本ID 00 – MPEG 2.5 01 – 保留 10 – MPEG 2 (ISO/IEC 13818-3) 11 – MPEG 1 (ISO/IEC 11172-3) 注:MPEG 2.5不是官方标准。帧头第20个比特用来表示2.5版本。不支持该版本的应用程序一般认为该比特位置位,也就是说帧同步(A)的长度为12而不是这里规定的11,这样B也就变成了1比特(第19个比特)。推荐使用我表示的方法因为这样允许你可以区分三个版本以获得最高兼容性。 TD> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
C | 2 | (18,17) | 层描述 00 - 保留 01 – 三层 10 – 二层 11 – 一层 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
D | 1 | (16) | 校验位 0 - CRC校验 1 - 没有校验 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
E | 4 | (15,12) | 比率索引
V1 - MPEG 1 V2 – MPEG 2和MPEG2.5 L1 – 一层 L2 – 二层 L3 – 三层 Free表示格式自由,如果固定比特率(这种文件不能变换比特率)和上表定义的不同,应该有应用程序决定。这种情况的实现应该只用于内部目的因为第三方应用程序是没有办法找出正确比特率的。但是这么做并不是很重要况且还浪费精力。Bad表示该值无效。 MPEG文件可以有VBR。表示文件的比特率可以变化。我已经知道了两种惯用方法: ? 比特率变换:每一帧都创建成不同的比特率。可以应用在任何层。 LayerIII解码器必须支持该方法。LayerI和LayerII也可以支持。? 比特池:比特率可以使从前面的帧中借来的(受限),以便腾出空间来容纳输入信号部分。然而这样就导致各帧之间不再相互独立,意味着不能随便分割文件。这种方法只有LayerIII支持。 更多的VBR信息可以参考Xing Tech site LyaerII中有一些不允许比特率组合和模式。下表是允许的组合。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
F | 2 | (11,10) | 采样频率(单位:Hz)
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
G | 1 | (9) | 填充比特 0 – 没有填充 1 – 填充了一个额外的槽 填充用来达到正确的比特率。例如:128k 44.1kHz LayerII使用了很多418bit或417bit长的帧来达到正确的128k比特率。LyaerI的槽有32bit长,LayerII和LayerIII的槽有8bit长。 如何计算帧长度 我们首先区分两个术语:帧大小和帧长度。帧大小表示一帧中采样的个数,这是恒定值。在LayerI中是384个采样在LayerII和LayerIII中是1152个。帧长度是压缩时每一帧的长度。它将槽也计算在内。LayerI的一个槽长4字节,LayerII和LayerIII的槽是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。 注意:因为有填充和比特率变换,帧长度可能变化。 从头中读取比特率,采样频率和填充, LyaerI使用公式: 帧长度(字节) = (12 * 比特率 / 采样频率 + 填充) * 4 LyerII和LyaerIII使用公式: 帧长度(字节)= 144 * 比特率 / 采样频率 + 填充 例: LayerIII 比特率 128000,采样频率 441000,填充0 =〉帧大小 417字节 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
H | 1 | (8) | 私有bit,可以用来做特殊应用。例如可以用来触发应用程序的特殊事件。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I | 2 | (7,6) | 声道 00 立体声 01 联合立体声(立体声) 10 双声道(立体声) 11 单声道(单声) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
J | 2 | (5,4) | 扩展模式(仅在联合立体声时有效) 扩展模式用来连接对立体声效果无用的信息,来减少所需的资源。这两个比特在联合立体声模式下有编码器动态指定。 完整的MPEG文件的频率序列分成有32个子带。在LayerI和LayerII中这两个字节确定强度立体声应用的频带。 LayerIII中这两个字节确定应用了哪一种联合立体声(气强度立体声或者边侧立体声)频带由解压算法决定。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
K | 1 | (3) | 版权 0无版权 1有版权 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L | 1 | (2) | 原创 0 原创拷贝 1 原创 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
M | 2 | (1,0) | 强调 00 - 无 01 - 50/15 ms 10 - 保留 11 - CCIT J.17 |
MPEG音频标签ID3v1
标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB
BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD
DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE
EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG
符号 | 长度 (bytes) | 位置 (bytes) | 描述 |
A | 3 | (0-2) | 标签标志。如果存在标签并且正确的话,必须包含'TAG'。 |
B | 30 | (3-32) | 标题 |
C | 30 | (33-62) | 艺术家 |
D | 30 | (63-92) | 唱片集 |
E | 4 | (93-96) | 年代 |
F | 30 | (97-126) | 注释 |
G | 1 | (127) | 流派 |
在ID3v1.1结构中有些改变。注释部分的最后一个字节用来定义唱片集中的轨道号。如果不知道该信息时可以用空字符(ASCII 0)代替。
流派是下列数字之一:
0 | 'Blues' | 20 | 'Alternative' | 40 | 'AlternRock' | 60 | 'Top 40' |
1 | 'Classic Rock' | 21 | 'Ska' | 41 | 'Bass' | 61 | 'Christian Rap' |
2 | 'Country' | 22 | 'Death Metal' | 42 | 'Soul' | 62 | 'Pop/Funk' |
3 | 'Dance' | 23 | 'Pranks' | 43 | 'Punk' | 63 | 'Jungle' |
4 | 'Disco' | 24 | 'Soundtrack' | 44 | 'Space' | 64 | 'Native American' |
5 | 'Funk' | 25 | 'Euro-Techno' | 45 | 'Meditative' | 65 | 'Cabaret' |
6 | 'Grunge' | 26 | 'Ambient' | 46 | 'Instrumental Pop' | 66 | 'New Wave' |
7 | 'Hip-Hop' | 27 | 'Trip-Hop' | 47 | 'Instrumental Rock' | 67 | 'Psychadelic' |
8 | 'Jazz' | 28 | 'Vocal' | 48 | 'Ethnic' | 68 | 'Rave' |
9 | 'Metal' | 29 | 'Jazz+Funk' | 49 | 'Gothic' | 69 | 'Showtunes' |
10 | 'New Age' | 30 | 'Fusion' | 50 | 'Darkwave' | 70 | 'Trailer' |
11 | 'Oldies' | 31 | 'Trance' | 51 | 'Techno-Industrial' | 71 | 'Lo-Fi' |
12 | 'Other' | 32 | 'Classical' | 52 | 'Electronic' | 72 | 'Tribal' |
13 | 'Pop' | 33 | 'Instrumental' | 53 | 'Pop-Folk' | 73 | 'Acid Punk' |
14 | 'R&B' | 34 | 'Acid' | 54 | 'Eurodance' | 74 | 'Acid Jazz' |
15 | 'Rap' | 35 | 'House' | 55 | 'Dream' | 75 | 'Polka' |
16 | 'Reggae' | 36 | 'Game' | 56 | 'Southern Rock' | 76 | 'Retro' |
17 | 'Rock' | 37 | 'Sound Clip' | 57 | 'Comedy' | 77 | 'Musical' |
18 | 'Techno' | 38 | 'Gospel' | 58 | 'Cult' | 78 | 'Rock & Roll' |
19 | 'Industrial' | 39 | 'Noise' | 59 | 'Gangsta' | 79 | 'Hard Rock' |
80 | 'Folk' | 92 | 'Progressive Rock' | 104 | 'Chamber Music' | 116 | 'Ballad' |
81 | 'Folk-Rock' | 93 | 'Psychedelic Rock' | 105 | 'Sonata' | 117 | 'Poweer Ballad' |
82 | 'National Folk' | 94 | 'Symphonic Rock' | 106 | 'Symphony' | 118 | 'Rhytmic Soul' |
83 | 'Swing' | 95 | 'Slow Rock' | 107 | 'Booty Brass' | 119 | 'Freestyle' |
84 | 'Fast Fusion' | 96 | 'Big Band' | 108 | 'Primus' | 120 | 'Duet' |
85 | 'Bebob' | 97 | 'Chorus' | 109 | 'Porn Groove' | 121 | 'Punk Rock' |
86 | 'Latin' | 98 | 'Easy Listening' | 110 | 'Satire' | 122 | 'Drum Solo' |
87 | 'Revival' | 99 | 'Acoustic' | 111 | 'Slow Jam' | 123 | 'A Capela' |
88 | 'Celtic' | 100 | 'Humour' | 112 | 'Club' | 124 | 'Euro-House' |
89 | 'Bluegrass' | 101 | 'Speech' | 113 | 'Tango' | 125 | 'Dance Hall' |
90 | 'Avantgarde' | 102 | 'Chanson' | 114 | 'Samba' | ? | ? |
91 | 'Gothic Rock' | 103 | 'Opera' | 115 | 'Folklore' |
其他任何的数值都认为是“unknown”
MPEG音频标签ID3v2
新提出的音频标签格式不同于ID3v1和ID3v1.1完整的技术规格请参考