zoukankan      html  css  js  c++  java
  • 如何计算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帧索引表的时候就这么搜的,其实对于小文件还是比较快的。

  • 相关阅读:
    .net core上传
    C#/.NET整数的三种强制类型转换(int)、Convert.ToInt32()、int.Parse()的区别
    14、Silverlight 滤镜到 UWP 滤镜的移植(二)
    13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)
    1、揭秘通用平台的 HttpClient (译)
    12、uwp 开发的零碎总结
    11、使用 WinAppDeployCmd 部署appx 包到 Windows10 Mobile上(更新)
    10、Windows10 上,在窗口左侧向右滑动打开 SplitView 的 Pane面板
    09、win32 转换为 store app
    08、通过自定义依赖属性,用 StateTrigger 修改全局主题样式
  • 原文地址:https://www.cnblogs.com/candycaicai/p/1889085.html
Copyright © 2011-2022 走看看