根据前两篇文章的分析,帧分为标签帧和数据帧,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. excel文件类型自动判断

    在实际excel读取中,会出现很多后缀为xlsx 内容实际确为xls的情况,反之亦然.所以光利用文件后缀名读取excel文件时,会有偏差. 本文则利用魔数以及结合文件后缀名共同判断excel文件类型, ...

  2. java 校验文件类型_java判断文件真实类型

    代码如下: importjava.io.FileInputStream;importjava.io.IOException;importjava.util.HashMap;/*** * 类描述:获取和 ...

  3. php 判断文件类型,php 判断图片文件的真实类型

    /** *  * 检测文件的真实类型 *   * @param  string $srcPath 文件路径 *    * @return string $realType 文件真实类型 *     * ...

  4. php 判断不是文件类型,php 判断文件类型

    [php]代码库$files = array ( 'c:\1.jpg', 'c:\1.png', 'c:\1.gif', 'c:\1.rar', 'c:\1.zip', 'c:\1.exe', ); ...

  5. linux 对文件类型的判断

    转载于:https://blog.51cto.com/12672409/2139274

  6. 如何判断任意文件类型

    这里写目录标题 如何判断任意文件类型 1问题 2可用的方案 2.1 使用HEX编辑工具 EmEditor Ultraedit WinHex DiskGenius 010Editor notepad++ ...

  7. ASP.NET上传文件对文件类型的高级判断

    以前发过一个.NET上传文件的方法的,不过那个方法中对文件类型的判断只是对后缀名来进行判断的,这样假如我把一个txt文本文件的后缀名改为jpg了也可以上传,这样无意中就造成了安全问题. 刚刚从网上找了 ...

  8. hadoop HDFS的文件夹创建、文件上传、文件下载、文件夹删除,文件更名、文件详细信息、文件类型判断(文件夹或者文件)

    摘要: 本篇文章主要介绍的是hadoop hdfs的基础api的使用.包括Windows端依赖配置,Maven依赖配置.最后就是进行实际的操作,包括:获取远程hadoop hdfs连接,并对其进行的一 ...

  9. SpringBoot中 判断上传的文件类型 MultipartFile file

    最新项目中有遇到 对于上传文件类型的判断   我们需要上传的文件是 excel类型的 原来我的做法很简单 就是 获取文件名然后去判断 后缀名是否是 .xls 或者是 .xlsx 类型 //判断文件类型 ...

最新文章

  1. 32岁程序员,失业4个月45次面试经历,与君共勉
  2. 百度地图的简单使用 ——html js
  3. Swift3.0语言教程使用路径字符串
  4. 自动混合精度(AMP)介绍与使用【Pytorch】
  5. 第二十二讲 对角化分解和幂公式
  6. oracle as sydba,oracle用户 sysdba 与system,sysoper的区别
  7. VTK:可视化之NoShading
  8. docker WARNING: IPv4 forwarding is disabled. 解决方法
  9. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第52篇]选择一个先进的应用概念,如电子投票、拍卖或多方计算。这种系统的大致安全要求是什么?
  10. English trip M1 - PC9 Where am I Teacher:Jade
  11. Linux Shell 文本处理工具集锦 zz
  12. python的特性注定了代码无法保密_python 基础
  13. python实验三答案_20192116 实验三《Python程序设计》实验报告
  14. 那些在一个公司死磕了5-10年的测试员,最后都怎么样了?
  15. 【秀米教程4】秀米推文上传到微信公众号后台
  16. Ubuntu 20.04系统中Sage(sagemath)安装及使用详细过程
  17. 十二、在PPT中添加页码
  18. 石墨笔记, Onenote 和 Effie 哪个适合单口或脱口秀作者?
  19. MySQL优化系列16-优化MySQL的锁
  20. 访问www.baidu.com的过程

热门文章

  1. python定间隔取点(np.linspace)
  2. 不动产登记中心计算机岗位,武汉市不动产登记中心属事业单位2019年招聘人员岗位一览表...
  3. Arcgis更换布局模板_适合个人的网站导航静态模板
  4. 超详细!附源码!SpringBoot+shiro+mybatis+Thymeleaf实现权限登录系统
  5. ​原创 | AI顶会论文很多附带源代码?不少是假开源!
  6. dell VOSTRO 5470 恢复efi启动方法(在uefi添加efi启动项的操作)
  7. python zip暴力破解
  8. 门户通专访李进斌:火车头采集器-站长的伴侣
  9. MIPCMS建站系统 v5.0.1免费下载
  10. STM32基于WiFi和蓝牙的内外网通信