5.3. 判断是VBR还是CBR,根据公式计算播放时间

5.3.1. 定位出Xing头的位置

根据 公式 4.3 “XING头位置” 定位到XING头所在位置。上式中:

  1. MPEG头位置:

    如果没有ID3 V2这类的信息的话,那么MPEG头位置就是文件的最开始,即0的位置。

  2. MPEG帧头大小:

    固定的32 bit = 4字节,所以加4.

  3. 边信息大小:

    对应Layer III,根据MPEG的版本,查下表可得,单位为字节:

表 5.1. MPEG Layer III的边信息(side information)(单位:字节)

MPEG 1 MPEG 2/2.5 (LSF)
立体声,联合立体声,双声道 321 17
单声道 17 9

1

我们最常见的,双声道的MP3,不论是VBR还是CBR,对应的边信息,都是32个字节。

5.3.2. 如果有Xing头,则是VBR,解析XING头,计算播放时间

如果对应XING头的位置有对应的” Xing”字符,那就说明是Xing头。

那么就可以解析Xing头,找到对应的我们所需要的一些值,尤其是总的帧数。

然后用之前介绍的公式 4.2 “VBR MP3总的时长(VBR Duration)”去计算VBR的播放时间。

其中:

  1. 总的帧数(Number of Frames):

    可以通过解析XING头,找出里面总帧数(Frames),这个字段,一般都是存在的。

  2. 帧的采样个数(Samples Per Frame):

    根据前面解析MPEG,找到MPEG的版本,基于属于哪个Layer,然后根据表 3.4 “MPEG帧的采样数索引表(单位:个/帧)”查得每帧的采样个数,得到每一帧有多少个采样。

    而对于MP3(MPEG-1,Layer III)此处肯定是对应的1152

  3. 采样率(Sampling Rate):

    根据前面解析MPEG,找到2比特大小的采样率索引 ,然后根据表 3.3 “MPEG帧的采样率索引表(单位:Hz)”找到对应的采样率。

此处,也就是找到我们前面所说的,总的帧数,加上另外两个参数:帧的采样数和帧的采样率(都是通过解析第一帧的帧头,即可算出对应的值),然后我们就可以算出VBR的MP3文件的总的播放时间长度了。

5.3.3. 如果没XING头,定位出VBRI头位置,找VBRI头

计算出VBRI的位置,如果该位置找到“VBRI”字符,那么说明是VBRI头。

然后解析VBRI,找到对应的总的帧数,然后和XING头算法类似,用上面的公式计算出VBR的播放时间即可。

5.3.4. 如果也没找到VBRI头,则是CBR,计算CBR的播放时间

如果连VBRI头也没找到,即,Xing和VBRI都没有,那么则是CBR。

然后用公式 4.1 “CBR播放时间(CBR Duration)”计算出播放时间长度。

其中:

  1. 文件大小(File Size):

    文件大小 = 总文件大小 – 头信息大小

    这里的头信息,指的是ID3 V1或ID3 V2之类的头信息。

    而总文件大小,这个不用多解释,就是整个MP3的大小。

    两者单位都是字节。

  2. 比特率:

    通过解析第一帧的MPEG,即可得到比特率的索引值,然后查表 3.2 “MPEG比特率索引表(单位:Kbit/s)”,即可得到此MP3的比特率大小。

    然后套用上面的公式,即可算出CBR的MP3的播放时间长度了。