zoukankan      html  css  js  c++  java
  • 如何计算MP3的总时长问题(一)

      MP3是大家所熟悉的一种音乐播放格式,它其实是mpeg标准中的mpeg1的layer3编码,这个是和压缩技术相关的,对于mpeg的了解,大家可以去网上找一些格式解析的文档,在这里我们只要知道MP3这种格式是什么就够了,在以下的内容中,会有详细解释。

         MP3中有一个关键词就是:帧,MP3是由若干个帧组成。

         1、Mp3的文件结构

      MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1),其中ID3V1在整个MP3文件的末尾128个字节,包含了作者,作曲,专辑等信息,而ID3V2是在文件的开头部分,是对ID3V1的扩展包含MP3的一些信息如作者,专辑,发行日等等,它的大小不固定,可以从他的标签头记录的是个字节中得到标识和大小。

       char Header[3];    /*必须为"ID3"否则认为标签不存在*/

       char Ver;    /*版本号ID3V2.3就记录3*/

       char Revision;    /*副版本号此版本记录为0*/

       char Flag;    /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/

       char Size[4];    /*标签大小,包括标签头的10个字节和所有的标签帧的大小*/

    我们可以从文件头搜索钱十个字节,判断最初三个字节是否有ID3的标识,如果没有,证明标签头不存在,然后计算标签大小:

           一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下 

        0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

     计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:

     int total_size  =  (Size[0]&0x7F)*0x200000

              +(Size[1]&0x7F)*0x400

              +(Size[2]&0x7F)*0x80

              +(Size[3]&0x7F)

      按道理来说,跳过标签大小,就是第一帧的帧头位置,但是有时候却不是,所以我们仍然要搜索判断是否是帧头,下面我们来看mp3的帧结构。

      2、Mp3的帧详解 

      每一帧其实包括 帧头,附加信息,主数据,其实我们只要找到帧头,帧头中所包含的数据就能让我们掌控这一帧的信息,帧头固定4个字节(32bit),格式如下

      AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 

      (其实这些字母就是表示了每位都代表不同的信息,相同字母就是相同的一类信息),11个A就是判断是否是帧头的同步效应,当所有A的位置都为1时,那么我们就找到帧头的位置,之后我们会对格式详细分析,通过帧头就能得到我们需要的数据信息。

    (需要解析出帧头得到相应数据,才能计算出总时长,此文章继续连载)

  • 相关阅读:
    php的date对象与javascript的Date对象区别
    window.open的popup-only-once问题(document.cookie)
    window.open详解
    顶级窗口问题window.top
    javascript中的this用法
    问题1:javascript的函数对象问题
    javascript中this的用法
    javacsript:在函数内访问全局变量
    bzoj1934
    bzoj1433
  • 原文地址:https://www.cnblogs.com/candycaicai/p/1872442.html
Copyright © 2011-2022 走看看