如何计算MP3总时长的问题(三)--对于变比特率MP3求总时长
2010-11-26 18:12
239 查看
3、变比特率MP3总时长求解
之前我们所讨论的都是对于一个固定比特率(CBR)的MP3进行求总时长,由于固定比特率的特殊性,很容易第一帧的帧头就能知道整个MP3的信息,但是对于变比特率(VBR)的MP3,比特率和帧长都不是固定的,所以我们就不能用之前的公式来计算总时长。
其实在第一帧的帧头后面还存着VBR的一些信息,里面存着文件长度,总帧数等信息,从而使我们很快算出变比特率的总时长,方法如下:
1)XING头标志
由于VBR是XING公司推出的算法,所以在MP3的第一帧里会有"XING"或者"Info"的关键字,具体格式
还有别的信息,这里不需要,我就不在这里说了。
2) VBRI头标志
还有一种头也同样标识和XING类似,只是有"VBRI"的关键字,具体格式
我只写了对总时长有需要的位置,其他的暂时没用到,就不提了,不过可以讨论。
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帧索引表的时候就这么搜的,其实对于小文件还是比较快的。
之前我们所讨论的都是对于一个固定比特率(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帧索引表的时候就这么搜的,其实对于小文件还是比较快的。
相关文章推荐
- 如何计算MP3的总时长问题(一)
- 如何计算MP3的总时长问题(一)
- 如何计算MP3的总时长问题
- 如何计算MP3总时长的问题(二)
- 求救!胜负比率计算问题?如何用SQL语句实现?(存储过程也可以)
- 讨论一个问题:对于复杂的业务流程Sharepoint如何实现?
- 关于结构体中如何计算的问题
- 讲解对于Java中如何计算日期之间的天数知识
- 建站或者网站搬家换空间的时候,企业站长最关心的一个问题是该如何选择网站空间,而这一问题对于一些擅长的站长来说非常小意思,但对于部分企业站长来说是一个比较头疼的问题。根据不完整数据显示,很多企业站长因为
- 如何制作安卓项目gif效果图及其简单菜单munu的计算问题
- 总结概括对于大数据、高并发的网站如何进行优化的问题
- 对于文章中的tab和空格如何统一的问题。
- 4.14节问题: 如何根据软盘的逻辑扇区号计算物理扇区号?
- 对于如何解决wicket Ajax 自动提示应用中出现的乱码问题!
- R语言——解决no function “distm”问题【如何用经纬度计算实际距离】
- 对于如何让u盘考入大于4G的单个文件的问题
- Matlab研究小问题:如何计算一条线段所经过的网格区域和各区域内的长度
- 在arcgis使用python脚本进行字段计算时是如何解决中文问题的
- 对于目前国内物价飞涨。程序员如何面对工资福利问题
- 如何加快数模计算以及如何解决数模计算的收敛性问题