分类: 嵌入式
2009-09-19 19:58:28
VBR MP3的帧头主要有两种,XING和VBRI。
关于它们的具体格式和含义,下面会详细解释。
另外常常会提到的是,关于V1和V2两个版本的ID3 头信息,这个主要是用于记录音频文件的一些描述信息,比如歌手,专辑,曲风等,和对音频文件解码,没有直接关系。属于存储音频文件附属信息的头。
ID3的V1和V2,不会同时存在。如果存在ID3的话,一般ID3 V1会放在音频文件的最后,大小128个字节,其中前三个字节是字符“TAG”。ID3 V2放在音频文件的开头处,前三个字节是字符“ID3”。
关于ID3的具体格式,请参考附录中的引用文献。
由于此处介绍的内容,目的是尽快,尽可能精确地去估算MP3文件的(持续)播放时间。所以,此处不涉及,关于如何去编解码实际的音频数据。
MPEG音频文件,由一个个的帧(Frame)组成。每一帧都有个帧头(Frame Header),位于该帧的最开始处,接下来的是音频数据。音频数据多数都是包含了 固定数目 的 音频采样(Sample)。正是基于这个特性,才有后面的VBR的播放时间计算公式。
前面介绍过了,目前,存在的三种Layer的MPEG音频,尽管他们的压缩方法各不相同,但是帧头格式都一样。
这些帧,由一个个的Slot(槽)组成。
Layer I中,一个Slot是4个字节,在Layer II和Layer III中,一个Slot是一个字节。
MPEG帧头的格式及含义
位置 |
长度 |
含义 |
示例 |
0 |
11 |
用于同步帧,找到此帧头(所有位均置1) |
1111 1111 111 |
11 |
2 |
音频版本ID (参见 表3.2) 00 - 版本是MPEG 2.5 (MPED-2的非官方扩展版本) |
11 |
13 |
2 |
Layer 的索引 00 – 保留 |
01 |
15 |
1 |
保护位 0 – 用16位的CRC保护下面的帧头 |
1 |
16 |
4 |
比特率索引 (参见 表2.1.3) |
1001 |
20 |
2 |
采样率索引 (参见表2.1.2) |
11 |
22 |
1 |
填充位 如果设置了,就会对每帧数据填充一个slot (对于帧大小的计算很重要) |
0 |
23 |
1 |
私有位 (仅用于标示性的) |
1 |
24 |
2 |
声道的模式 00 – 立体声 注: 双声道文件由两个独立的单声道所组成。大多数解码器把双声道输出成立体声,但是实际上,不是所有的双声道都是立体声的。 |
01 |
26 |
2 |
模式扩展 (仅用于联合立体声) (参见 表 2.1.6) |
00 |
1 MPEG音频帧头的格式
在MPEG标准中,描述了一种自由格式(free format),这种自由格式意思为用一个固定比特率对文件进行编码,而此固定的比特率不是我们表中预定义好的。一般的解码器都无法解码这类音频文件。
下面是比特率索引表,(单位:Kbit/sec)。
比特率 索引 |
MPEG 1 |
MPEG 2, 2.5 (LSF) | |||
Layer I |
Layer II |
Layer III |
Layer I |
Layer II & III | |
0000 |
空闲 | ||||
0001 |
32 |
32 |
32 |
32 |
8 |
0010 |
64 |
48 |
40 |
48 |
16 |
0011 |
96 |
56 |
48 |
56 |
24 |
0100 |
128 |
64 |
56 |
64 |
32 |
0101 |
160 |
80 |
64 |
80 |
40 |
0110 |
192 |
96 |
80 |
96 |
48 |
0111 |
224 |
112 |
96 |
112 |
56 |
1000 |
256 |
128 |
112 |
128 |
64 |
1001 |
288 |
160 |
128 |
144 |
80 |
1010 |
320 |
192 |
160 |
160 |
96 |
1011 |
352 |
224 |
192 |
176 |
112 |
1100 |
384 |
256 |
224 |
192 |
128 |
1101 |
416 |
320 |
256 |
224 |
144 |
1110 |
448 |
384 |
320 |
256 |
160 |
1111 |
保留 |
2 比特率
为了计算帧大小,我们需要知道,每一帧里面包含多少个采样,即采样数/帧(sample per frame)。
|
MPEG 1 |
MPEG 2 (LSF) |
MPEG 2.5 (LSF) |
Layer I |
384 |
384 |
384 |
Layer II |
1152 |
1152 |
1152 |
Layer III |
1152 |
576 |
576 |
3 每帧的采样数
根据MPEG帧头里面的索引,对应的,不同版本的MPEG的采样率也是不同的:
采样率索引 |
MPEG 1 |
MPEG 2 (LSF) |
MPEG 2.5 (LSF) |
00 |
44100 Hz |
22050 Hz |
11025 Hz |
01 |
48000 Hz |
24000 Hz |
12000 Hz |
10 |
32000 Hz |
16000 Hz |
8000 Hz |
11 |
保留 |
4 MPEG不同版本对应的采样率
因此,帧大小可以用如下公式计算:
Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size
帧大小 = ((每帧的采样数 ÷ 8 × 比特率) ÷ 采样率)+ 填充大小 【公式1】
由于舍入误差,官方的计算帧大小的方法和此稍有不同。根据ISO标准,应该以slot为单位进行计算,然后对结果取整,再乘于slot的大小。
用如下公式可以计算MP3的播放时间,以秒为单位:
CBR Duration = File Size / Bitrate * 8
播放时间 = 文件大小 ÷ 比特率 × 8 【公式2】
对于CBR的文件,可以用上面的公式,通过第一帧,算出整个文件的播放时间。
对于VBR,要用另外的公式。下面将会详细介绍。
想要计算VBR的MP3的播放时间,我们必须要知道整个文件的平均比特率(average bitrate)。此平均比特率,一般来说,往往和第一帧的比特率相差很大。因为MP3音乐的开头部分,很多是用于现实标题的一些几乎无声的数据。也就意味着,如果解码器对于VBR文件,按照CBR文件来解码,而去通过第一帧去计算整个文件的播放时间,那么往往结果和实际相差很大。这也就是后面引用中一个帖子里面遇到的情况,即,Media Player Classic播放VBR的MP3时的时间问题。
为了得到平均比特率,你必须遍历整个文件的所有帧,然后再才能计算出来,即算出一共有多少帧,将每一帧的比特率加起来得到个总和,用总和去除于帧数,就是平均比特率了。
由于这个做法效率太低,所以就有了VBR的头这个东西,其放在第一帧帧头的后面的。
其包含了此VBR一共有多少帧,有了总的帧数,你就可以用下面的公式去计算播放时间了:
VBR Duration = Number of Frames * Samples Per Frame / Sampling Rate
VBR文件播放总时间 = 总的帧数 × 每一帧的采样个数÷ 比特率 【公式3】
此外,VBR的头中,往往还包含了一个用于定位的TOC(table of content)目录表。即用于在快进或快退的时候,通过表中的信息,可以方便地定位到对应的位置。如果没有此TOC表,需要单独去计算出对应的位置,比较麻烦。
|