第 4 章 MP3的播放时间的计算公式及XING和VBRI头介绍

目录

4.1. CBR的MP3的播放时间(duration)计算方法
4.1.1. 计算CBR的MP3的播放时间的方法之一
4.1.2. 计算CBR的MP3的播放时间的方法之二
4.1.3. 计算CBR的MP3的播放时间的两种方法的总结
4.1.3.1. 举例说明两种方法计算出结果的不同
4.2. VBR的MP3的播放时间(duration)计算方法
4.2.1. 平均比特率法
4.2.2. 总帧数法
4.2.3. VBR的两种Header:XING和VBRI
4.2.3.1. Xing TAG / Xing头(header)
4.2.3.2. VBRI头(header)

4.1. CBR的MP3的播放时间(duration)计算方法

4.1.1. 计算CBR的MP3的播放时间的方法之一

对于计算CBR的MP3的播放时间,其是Constant Bitrate,固定的比特率,每一帧的比特率也都是固定的同样的大小,所以,相对来说,很容易想得到,用文件大小,直接除于比特率,就可以得到文件的播放时间了,即就用如下公式可以计算MP3的播放时间:

公式 4.1. CBR播放时间(CBR Duration)

CBR Duration

= File Size(Byte) × 8 bit/Byte ÷ (Bitrate(K bit/s)× 1000 bit/Kbit )

CBR播放时间

= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)


其中:

  1. 文件大小:

    严格地说,应该是MP3的文件总大小,减去MP3的Tag的大小,即

    文件大小 = 总的MP3文件大小 – MP3的Tag大小

    其中,MP3的Tag,往往和MP3文件总大小相比,几乎可以忽略不计,所以,一般也可以直接用总的MP3为文件大小,直接来计算:

    文件大小 = 总的MP3文件大小

  2. 比特率:

    可以通过解析MP3文件的第一帧的MPEG的帧头,得到比特率的索引值,然后查比特率索引表,即可得到比特率是多少。

所以,可以看出,对于CBR的文件,可以用上面的公式,获得MP3文件大小后,再去解析第一帧的MPEG帧头,得到比特率索引值,查表得到比特率的值,然后就算出整个CBR MP3文件的播放时间。

4.1.2. 计算CBR的MP3的播放时间的方法之二

另外,多说一句,我原先以为,还有另外一种计算方法,即:

“总帧数乘于每一帧的时长法”

总的时长 = 每一帧的时长 * 总的帧数

就是先计算每一帧的时间长度,再计算一共有多少帧,然后将两者相乘,即可得到文件总时长。

其中:

= 每一帧的采样个数 * 每一采样的时长

= 每一帧的采样个数 * (1 / 每一帧的采样频率)

总的帧数

= 文件大小 / 单个帧的大小

= 文件大小(字节)* 8比特/字节 / ((每个帧的时长 * 比特率(千比特/秒) * 1000比特/千比特))

但是后来发现,上面这个计算总的帧数的方法,其实是不精确的,是把每一帧的4字节的MPEG帧头漏掉了。

因此,才会有之前的想法,认为这两种计算CBR的MP3的播放时间的计算公式是同一种:

此法,其实和上面的是同一个方法,因为上面两个等式相乘之后,即为:

总的时长

= 每一帧的时长 * 总的帧数

=每一帧的时长 * [总的文件大小(字节)* 8比特/字节 / ( (每个帧的时长 * 比特率(千比特/秒) * 1000比特/千比特) )]

= [总的文件大小(字节)* 8比特/字节 / [ 比特率 千比特/秒 * 1000比特/千比特)]

还是和上面的方法是,是同一个公式。

而对于上面的总的帧数的计算方法,真正正确的是:

总的帧数

= 文件大小 ÷ 单个帧的大小

= 文件大小 ÷ (帧头 + 帧数据)

= 文件大小 ÷ (固定的4字节 + 帧数据)

= 文件大小(字节)× 8比特/字节 ÷ ( 4 + [ 每个帧的时长 × 比特率(千比特/秒)× 1000(比特/千比特)] )

方法二,即为:

CBR播放时间

= 每一帧的时长 × 总的帧数

= (每一帧的采样个数 ×(1 / 每一帧的采样频率))×( 文件大小(字节)× 8比特/字节 ÷ ( 4 + [ 每个帧的时长 × 比特率(千比特/秒)× 1000(比特/千比特)] ) )

= 文件大小(字节)× ( 4 + (每一帧的采样个数÷每一帧的采样频率)× 比特率(千比特/秒)× 1000(比特/千比特)÷ 8比特/字节] ))×(每一帧的采样个数÷每一帧的采样频率)

其中:

文件大小:是总的MP3文件大小,减去MP3的Tag的大小。

4.1.3. 计算CBR的MP3的播放时间的两种方法的总结

也因此,最开始的原以为的第二种方法,和第一种,是同一种的想法,其实是错误的。正确的理解是,第二种方法的确是另外一个方法,而且更准确。

因为第一种方法:

CBR播放时间

= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)

中的比特率,只是针对每一帧的音频的数据的,而并不包括4字节的帧头,而(参见上面的解释):“常见MPEG帧的音频数据大小是418字节”,所以,这样比较起来,至少是,没418+4=422的这一个帧,其中只有418个是真正的音频数据,而比特率,指的只是这个帧数据的比特率,并不包括4字节的帧头,如果也包含进去了,那么则产生了误差,误差大概是4/(418+4)=0.95%,即大概是百分之一的误差。

即,方法一,计算出来的CBR的播放时间,大概有1%的误差。

而第二种方法:

CBR播放时间

= 每一帧的时长 × 总的帧数

= 文件大小(字节)× ( 4 + (每一帧的采样个数÷每一帧的采样频率)× 比特率(千比特/秒)× 1000(比特/千比特)÷ 8比特/字节] ) )×(每一帧的采样个数÷每一帧的采样频率)

就把每一帧的4字节的帧头,也计算进去了,好处是计算出来的播放时间更加精确,坏处是,计算起来,相对第一种方法来说,比较麻烦。

而第一种方法,虽然有大概1%的误差,但是很容易计算。所以现实中,常用第一种方法。

4.1.3.1. 举例说明两种方法计算出结果的不同

我找了个CBR的MP3,用千千静听去查看其播放时间,推断出,其用的是第一种方法计算的。

具体推断过程如下:

(此处为了方便计算,忽略了MP3的Tag的大小,而把整个文件大小看作是MP3的所有帧的总大小)

该MPEG 1- Layer III的MP3:

文件大小=11777537 字节

采样个数:1152

采样率:44100Hz

比特率:96kbps

【方法一】

总时长

= 11777537 × 8 ÷(96 × 1000)

= 981.46

【方法二】

总时长

= 11777537÷(4 + (1152÷44100)×(96×1000÷8) )×(1152÷44100)

= 11777537÷(4 + 313.47)×0.02612

≈11777537÷(4 + 314)×0.02612

= 11777537÷318×0.02612

= 967.48

即,方法二,是精确的MP3的总时长,为967.48,而方法一,计算出来的是有误差的981.46,误差为 (981.46-967.48)/ 967.48=1.34%,即大概为1%。

而千千静听查看到此MP3的播放时间为:16:20.454 = 980.454秒,

考虑到我们上面用方法一算出来的MP3的播放时间是981.46秒,是把MP3的Tag也算进去了,所以去掉Tag的大小,就是千千静听上看到的980.454秒了。

【总结】

因此,虽然方法二计算出来的播放时间更准确,但是实际上,为了更简便的计算,往往采用了误差大概只有1%,(一般用户也可以接受此误差),的第一种方法:

CBR播放时间

= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)