4.2.2. 总帧数法

总帧数法,即利用总的帧的数目,来计算VBR的播放时间。

此方法的前提,是我们前面就强调过的:

  1. MP3,即MPEG-1,Layer III,不论是CBR,还是VBR,每一帧的采样个数都是固定的1152个。即每一帧,都是固定的1152个采样。

  2. CBR和VBR中的固定和可变,都是指的是比特率Bitrate,而不是采样率Sample Rate。对于同一MP3文件,不论CBR还是VBR,采样率都是固定的。

了解了这两个前提后,就可以看出,对于VBR来说,虽然每一帧的比特率不同,但是每一帧的时间都是固定的,因为

每一帧的时间

= 该帧的采样个数 * 该帧的采样率

= 1152 * 采样率

其中:

  1. 采样个数:

    MPEG-1,Layer III,即MP3,不论是CBR还是VBR,都是固定的1152

  2. 采样率:

    对于单个的VBR文件,都是统一的,固定的,常见的是44100Hz。采样率可以通过解析第一帧的帧头得出采样率索引,然后查表得到采样率。

既然知道了每一帧的时间都是固定的,那么很容易就想到,如果知道VBR MP3有一共多少帧,那么就可以用 总的帧数 × 每一帧的时间 = 总的时间长度了。

所以,剩下的事情,就是去得到VBR MP3的总的帧数。

最简单,但是效率很低的方法就是,像上面方法1一样,遍历整个VBR文件,找出一共有多少帧,对于第一帧,解析第一帧的帧头,得到采样率。

这样有了采样率和总的帧数,就可以用上面的解释的原理来计算了,对应公式就是:

公式 4.2. VBR MP3总的时长(VBR Duration)

VBR Duration

= Total_Frame_Number * Time_Per_Frame

= Total_Frame_Number * (Sample_Number * Time_Per_Sample)

= Total_Frame_Number * (Sample_Number * (1 / Frame_Sample_Rate))

VBR MP3总的时长

= 总的帧数 * 单个帧的时长

= 总的帧数* (帧的采样个数 * 每个帧的时长)

= 总的帧数* (帧的采样个数 * (1 / 帧的采样率))



其中:

  1. 总的帧数:

    VBR中的总的帧的数目。

  2. 帧的采样个数:

    对于MP3(MPEG1,Layer III)来说,是固定的1152个采样。

  3. 帧的采样率:

    通过解析第一帧,即可得知帧采样率索引,查表,即可得此采样率。

但是,可以看到,虽然此遍历整个文件以得到总的帧数的方法,但是还是显得效率不高。此处我们毕竟只是需要知道总的帧数而已,却还是要遍历文件。

对此问题,想象一下,要是有人在VBR的文件头部,单独提供了这个总的帧数,那么不就可以省去了我们再去遍历整个文件了吗?

而实际情况是,你所想到的事情,别人已经帮你实现了。^_^。

现实中,VBR文件中,就是已经有了对应的头Header,用于存放VBR相关的信息。

这样的头信息,也就是下面将要介绍的XING和VBRI。