3、变比特率MP3总时长求解
之前我们所讨论的都是对于一个固定比特率(CBR)的MP3进行求总时长,由于固定比特率的特殊性,很容易第一帧的帧头就能知道整个MP3的信息,但是对于变比特率(VBR)的MP3,比特率和帧长都不是固定的,所以我们就不能用之前的公式来计算总时长。
其实在第一帧的帧头后面还存着VBR的一些信息,里面存着文件长度,总帧数等信息,从而使我们很快算出变比特率的总时长,方法如下:
1)XING头标志
由于VBR是XING公司推出的算法,所以在MP3的第一帧里会有"XING"或者"Info"的关键字,具体格式
位置 | 长度(字节) | 含义 |
0 | 4 | 包含ASCII的字符XING或者Info,没有NULL结尾 |
4 | 4 | 标识位 0x0001 - 存在总帧数(Frames)字段 |
8 | 4 | 若标识位存在总帧数,那么这四个字节就是总帧数 |
12 | 4 | 若标识位存在文件大小,那么这四个字节就是文件大小 |
还有别的信息,这里不需要,我就不在这里说了。
2) VBRI头标志
还有一种头也同样标识和XING类似,只是有"VBRI"的关键字,具体格式
位置 | 长度(字节) | 含义 |
0 | 4 | 包含ASCII的字符VBRI,没有NULL结尾 |
10 | 4 | 文件大小 |
14 | 4 | 总帧数 |
我只写了对总时长有需要的位置,其他的暂时没用到,就不提了,不过可以讨论。
3)确定标志头位置
知道的有这样的标志头可以帮助我们很快找到需要的信息,那么如何定位呢,公式如下:
标志头位置 = MPEG 头位置 + MPEG帧头大小(4字节)+ 边信息大小
对于边信息,我们可以根据头中所给J位置上2个字节得到
mode = (header>>6)&0x03
其中:'00' Stereo; '01' Joint Stereo (Stereo); '10' Dual channel (Two mono channels);
'11' Single channel (Mono).
MPEG 1 MPEG2/2.5
Stereo ,Joint Stereo Dual channel 32 17
Mono 17 9
现在已经很清楚了,我们就能定位出来头标志,然后读出我们需要的总帧数,之前一届我已经介绍了每帧持续时间,因此
VBR的MP3总时长(毫秒) = 总帧数*每帧持续时间
到此不知道我讲的清楚不清楚,这也是我通过自己做,和看别人的文档总结的一些,希望能帮助到需要的人,有什么问题可以和我讨论。
这个准确度还是比较高的,前提是从帧头中读到的信息是正确有效的,呵呵,我测得大部分MP3还是比较正确的,如果真的要准确,那就预读一遍MP3文件,把每一帧的找到,累加得到帧数,我做MP3帧索引表的时候就这么搜的,其实对于小文件还是比较快的。