如何计算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时,那么我们就找到帧头的位置,之后我们会对格式详细分析,通过帧头就能得到我们需要的数据信息。

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

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