根据前两篇文章的分析,帧分为标签帧和数据帧,MP3文件类型是根据数据帧的类型来分的,文件类型如下表:

位率相等(Constant BitRate)

CBR  Mp3文件

位率不等(Variable BitRate)

Xing  Mp3文件

VBRI  Mp3文件

一、如何判断一个Mp3文件的类型,CBR文件,VBRI文件还是Xing文件

以功能流程图的形式:

二、文件播放时长的计算问题。

区分了文件类型就可以计算Mp3文件的播放时长了。

1.CBR文件的时长计算(duration)

对于计算CBR 的MP3的播放时间,其是Constant Bitrate,固定的比特率,每一帧的比特率也都是固定的同样的大小,所以,相对来说,很容易想得到,用文件大小,直接除于比特率,就可以得到文件的播 放时间了,即就用如下公式可以计算MP3的播放时间:
CBR Duration = File Size(Byte) ×  8 bit/Byte ÷ (Bitrate(K bit/s)×  1000 bit/Kbit )
CBR播放时间 = 文件大小(字节)×  8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特) 【公式1】
其中:
  文件大小:严格地说,应该是 MP3的文件总大小,减去 MP3的 Tag 的大小,即:文件大小  = 总的MP3文件大小 – MP3的
Tag 大小;其中,MP3的 Tag,往往和
MP3文件总大小相比,几乎可以忽略不计,所以,一般也可以直接用总的MP3为文件大小,直接来计算:文件大小  = 总的MP3文件大小。
  比特率:可以通过解析MP3文件的第一帧的MPEG的帧头,得到比特率的索引值,然后查比特率索引表,即可得到比特率是多少。
     所以,可以看出,对于 CBR的文件,可以用上面的公式,获得MP3文件大小后,再去解析第一帧的MPEG帧头,得到比特率索引值,查表得到比特率的值,然后就算出整个CBR MP3文件的播放时间。

2.VBR文件的时长计算(duration)

2.1平均比特率法
这个方法,就是和CBR 同样的思路,对于 VBR 的MP3来说,假如也像 CBR
的MP3一样,也有个类似的每一帧都是固定的某个值的比特率,那么计算整个 VBR的播放时间,也就可以用上面CBR
一样的公式去计算了。  由此,就有了平均比特率的概念,即,将所有帧的比特率的值相加,得到一个总的比特率的值,然后除于总的帧数,就得到了一个平均比
特率,这样,使得理论上,此 VBR 相当于一个比特率为该平均比特率的CBR 了。 
    
不过,可以看出,需要计算平均比特率之前,要先得到每一帧的比特率的值,以及总的帧的数目,然后才可以计算平均比特率的值。而为了得到每一帧的比特率的
值,就要将整个 VBR
MP3文件都遍历一遍,以此找到所有的帧,并解析每一个帧的帧头,得到比特率索引值,然后查表得到比特率的值。如此做的话,效率显然很低。因为此处只是为
了计算整个 VBR MP3的播放时间,却要遍历整个文件,还要解析每一帧的帧头。

2.2 总帧数法

总帧数法,即利用总的帧的数目,来计算 VBR 的播放时间。
此方法的前提,也是MP3文件的规范(以下两点非常重要):
(1)MP3,即 MPEG-1,Layer III,不论是 CBR,还是 VBR,每一帧的采样个数都是固定的 1152个。即每一帧,都是固定的 1152个采样。
(2)CBR和 VBR中的固定和可变,都是指的是比特率 Bitrate,而不是采样率 Sample Rate。对于同一 MP3文件,不论 CBR还是 VBR,采样率都是固定的。

 
了解了这两个前提后,就可以看出,对于 VBR 来说,虽然每一帧的比特率不同,但是每一帧的时间都是固定的,因为

每一帧的时间= 该帧的采样个数  * 该帧的采样率 = 1152 * 采样率

其中:
  采样个数:MPEG-1,Layer III,即MP3,不论是CBR 还是VBR,都是固定的 1152 采样率:对于单个的 VBR 文件,都是统一的,固定的,常见的是 44100Hz。采样率可
以通过解析第一帧的帧头得出采样率索引,然后查表得到采样率。 
 既然知道了每一帧的时间都是固定的,那么很容易就想到,如果知道 VBR MP3有一共多少帧,那么就可以用 总的帧数 × 每一帧的时间 = 总的时间长度了。公式如下:

VBR Duration
= Total_Frame_Number * Time_Per_Frame
= Total_Frame_Number * (Sample_Number * Time_Per_Sample)
= Total_Frame_Number * (Sample_Number * (1 / Frame_Sample_Rate))  ------------------因为是Mp3,所以Sample_Number=1152

所以,剩下的事情,就是去得到 VBR MP3的总的帧数和采用率。
获取第一个数据帧,解析帧的帧头,别忘了,在VBR文件的“Xing”标志或“VBRi”标志的头中,会记录帧的总个数,这样就可以轻易地得到总的帧数和
采样率了。不过如果帧头没有记录总帧数信息的话,还得遍历整个文件计算总帧数。

四、Mp3文件类型及其判断的更多相关文章

  1. java代码判断文件类型(判断文件后缀名)

    1.两点需要注意 1.string.spilt("\\.")分割字符串成子字符串数组,以“.”分割,必须写成string.spilt("\\.")的方式,不能写 ...

  2. Shell系列(24)- 条件判断之文件类型

    按照文件类型进行判断 标红,记住:其他了解即可 测试选项 作用 -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符 ...

  3. struts2文件上传,文件类型 allowedTypes

    struts2文件上传,文件类型 allowedTypes 1 '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript ...

  4. struts2上传文件类型列表

    '.a'      : 'application/octet-stream',         '.ai'     : 'application/postscript',         '.aif' ...

  5. Struts2 文件上传 之 文件类型 allowedTypes

     转自:https://www.cnblogs.com/zxwBj/p/8546889.html '.a'      : 'application/octet-stream', '.ai'     : ...

  6. struts2文件上传,文件类型 allowedTypes对应

    '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript', 3 '.aif' : 'audio/x-aiff', 4 ...

  7. 获取pe文件的文件类型

    工程文件petype.cpp通过调用pefile类中的函数获取文件类型. 文件类型的判断通过5个监测点完成. 监测点1:dos头的e_magic 监测点2:nt头的Signature 监测点3:文件头 ...

  8. Python使用filetype精确判断文件类型 (文件类型获取)

    filetype.py Small and dependency free Python package to infer file type and MIME type checking the m ...

  9. UWP开发细节记录:判断文件类型

    StorageFile.ContentType 属性,是 string 类型,用来表示文件内容的 MIME 类型.例如,音乐文件可能有 "audio/mpeg" MIME 类型.( ...

随机推荐

  1. codevs1009

    题目地址:http://codevs.cn/problem/1009/ 分析: [TAG]FLOYD,乘法原理,高精度 [构思] 求可变换数的个数,那么就是组合数学的内容,四个原理的应用: 假如能知道 ...

  2. 向html某个元素中添加信息

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. T-SQL 函数概述

    T-SQL函数的类别和描述: 函数类别 作用 聚合函数 返回一个标量值,表示在某个值域上的聚合,应用于特定的聚合选择或者汇总 配置变量 返回SQL Server执行环境的信息.这些信息可用于给对象编程 ...

  4. iOS-设计模式之代理反向传值

    代理设计模式就是自己的方法自己不实现,让代理对象去实现. 可以让多个类实现一组方法. 委托模式的好处在于: 1.避免子类化带来的过多的子类以及子类与父类的耦合 2.通过委托传递消息机制实现分层解耦 代 ...

  5. QTestlib Manual翻译

    Trolltech公司提供的QTestlib框架,是一种针对基于QT编写的程序或库的单元测试工具.QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展功能. 目录: QtestL ...

  6. asp.net js 获取服务器控件值

    最近在弄js 但是设计到获取服务器控件的值,有点模糊.百度查了资料都达不到效果.现在看看这个,希望朋友们能用上!! <asp:Label ID="lbDepartName" ...

  7. CI(CodeIgniter)学习第一讲

    一.CI的优势一. (1).CI是一个PHP框架:大家都知道PHP框架有很多,CI只是其中之一,框架是为了重用发明的.同样,CI的目标是实现让你比从零开始编写代码更快速地开发项目.CI可以将需要完成的 ...

  8. MVC 过滤

    我们来看两个接口: public interface IActionFilter { // Methods void OnActionExecuted(ActionExecutedContext fi ...

  9. ansilbe 入门001、ansible的介绍

    概述: ansible 作为一个配置管理工具.首先我们要“告诉”它管理的是那几台机器啊:而这个信息就在要ansible 的配置文件中体现了.默认情况下ansible的配置文件保存在 /etc/ansi ...

  10. 认识元数据和IL(中)<第四篇>

    书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知,下面是时候来了 ...