如何计算MP3总时长的问题(三)对于变比特率MP3求总时长

        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)字段
0x0002 - 存在文件大小(Bytes)字段
0x0004 –存在 TOC字段 
0x0008 – 存在音频质量指示字段

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帧索引表的时候就这么搜的,其实对于小文件还是比较快的。

原文地址:https://www.cnblogs.com/candycaicai/p/1889085.html