睾丸有好多粗的血管:MP3的播放时间的计算公式及XING和VBRI头介绍

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 14:34:10
的播放时间的计算公式及XING和VBRI头介绍
的MP3的播放时间(duration)计算公式
因此,帧大小可以用如下公式计算:
Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size
帧大小 = ((每帧的采样数 ÷ 8 × 比特率) ÷ 采样率)+ 填充大小   【公式1】
由于舍入误差,官方的计算帧大小的方法和此稍有不同。根据ISO标准,应该以slot为单位进行计算,然后对结果取整,再乘于slot的大小。
用如下公式可以计算MP3的播放时间,以秒为单位:
CBR Duration = File Size / Bitrate * 8
播放时间 = 文件大小 ÷ 比特率 × 8                                 【公式2】
对于CBR的文件,可以用上面的公式,通过第一帧,算出整个文件的播放时间。
对于VBR,要用另外的公式。下面将会详细介绍。
的MP3的播放时间(duration)计算公式
想要计算VBR的MP3的播放时间,我们必须要知道整个文件的平均比特率(average bitrate)。此平均比特率,一般来说,往往和第一帧的比特率相差很大。因为MP3音乐的开头部分,很多是用于现实标题的一些几乎无声的数据。也就意味着,如果解码器对于VBR文件,按照CBR文件来解码,而去通过第一帧去计算整个文件的播放时间,那么往往结果和实际相差很大。这也就是后面引用中一个帖子里面遇到的情况,即,Media Player Classic播放VBR的MP3时的时间问题。
为了得到平均比特率,你必须遍历整个文件的所有帧,然后再才能计算出来,即算出一共有多少帧,将每一帧的比特率加起来得到个总和,用总和去除于帧数,就是平均比特率了。
由于这个做法效率太低,所以就有了VBR的头这个东西,其放在第一帧帧头的后面的。
其包含了此VBR一共有多少帧,有了总的帧数,你就可以用下面的公式去计算播放时间了:
VBR Duration = Number of Frames * Samples Per Frame / Sampling Rate
VBR文件播放总时间 = 总的帧数 × 每一帧的采样个数÷ 采样率          【公式3】
此外,VBR的头中,往往还包含了一个用于定位的TOC(table of content)目录表。即用于在快进或快退的时候,通过表中的信息,可以方便地定位到对应的位置。如果没有此TOC表,需要单独去计算出对应的位置,比较麻烦。
4.2.1 Xing TAG / Xing头(header)
此tag由XING公司推出的算法/规范,所以叫做XING。
对于大多数的VBR文件都加了此头,但并不全是。此头位于MPEG音频头后面的某个特定位置。包好了此XING头的第一个帧,其后的数据是空的,所以即使解码器没有考虑到此头,也可以正常处理此帧。对于Layer III的文件来说,比如常见的MP3,此VBR放在边信息(side information)之后。
下表是XING头的具体格式及含义:
位置
长度(字节)
含义
示例
0
4
4个ASCII字符的VBR头 ID,要么是Xing,要么是Info,无NULL结尾(普通字符串都以NULL,即/0结尾)
'Xing'
4
4
存放一个标志,用于表示接下来存在哪些域/字段,各字段逻辑或的结果.
0x0001 - 存在总帧数(Frames)字段
0x0002 - 存在文件大小(Bytes)字段
0x0004 –存在TOC字段
0x0008 – 存在音频质量指示字段
0x0007
就表示下面存在 总帧数,文件大小总字节数,TOC表
8
4
总帧数(Frames),大端[可选]
7344
8或12
4
文件总大小,单位字节,大端[可选]
45000
8,12,16
100
TOC表,大端[可选]
8或12, 16, 108, 112,116
4
音频质量指示,最差0,最好100,大端[可选]
0
5  XING 头
虽然知道了XING头的具体含义,可以去根据具体的值,解析出对应的含义了,但是,由于
其是放在side information之后的,所以,要先定位,找到XING头,关于其位置,用如下公式计算:
XING头位置 = MPEG头位置 +  MPEG帧头大小 + 边信息大小
= MPEG头位置 +  4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC) + 边信息大小   【公式4】
注:
根据头的格式,Xing头里面必须包含ID和flag这两个段。其他字段都是可选的,是否包含,要看flag的值。有时候这个Xing头,CBR里面也有,此时,前面的ID的值就是Info,而不是Xing了。
4.2.2 VBRI头(header)
据了解,目前此头信息,只有用Fraunhofer的编码器生成的MPEG音频文件,才会用到此头。其和Xing头不一样,其放在第一个MPEG头的后面,大小正好是32字节。其位置,长度和示例,都是以字节为单位。
下表是VBRi头的具体格式及含义,单位为字节:
位置
长度
含义
示例
0
4
4个ASCII字符的VBR头ID:“VBRI”无NULL结尾
“VBRI”
4
2
版本ID,大端,类型:DWORD
1
6
2
延迟,类型:float
7344
8
2
音频质量指示
75
10
4
文件总大小,大端,类型:DWORD
45000
14
4
总的帧数,大端,类型:DWORD
7344
18
2
TOC表的表项数目,大端,类型:WORD
100
20
2
TOC表项的缩放因子,大端,类型:DWORD
1
22
2
单个TOC表项的大小,单位字节,最大为4,大端,类型:DWORD
2
24
2
帧数/表项,大端,类型:WORD
845
26
用于检索的TOC表,整型值,可以通过每个表项大小乘于表项个数得到此TOC表的总大小,大端
6  VBRI头
计算CBR和VBR的MP3文件的播放时间的步骤
此处只是大概总结一下,具体解析出播放时间,需要哪些步骤。其对应的代码,可以去文章引用中的【1】,注册登录后,可以下载源代码,自己看,就知道了。
或者,可以去参考引用【2】中的Mplayer的VBR 的patch,里面写的更加简单,但是也更容易看明白。
定位到MPEG的帧头的位置
如果文件开始没有ID3 V2的头信息,那么一般MPEG的帧头位置是0,当然,具体还是要根据帧头中的同步位(sync bit),共11位去定位找到帧头。
解析MPEG帧头,获取必要信息
主要是根据帧头格式,解析出MPEG的版本,MPEG的Layer,以及采样率,比特率等信息,用于后面的解码和计算播放时长。
判断是VBR还是CBR,根据公式计算播放时间
解析完MPEG头之后,按照如下步骤去判断是CBR还是VBR,并计算出播放时长:
5.3.1 定位出Xing头
根据:
XING头位置 =  MPEG头位置 +  4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC)  + 边信息大小                     【公式4】
计算定位到XING头所在位置。上式中:
MPEG头位置:
如果没有ID3 V2这类的信息的话,那么MPEG头位置就是文件的最开始,即0的位置。
MPEG帧头大小:
一般为固定的32 bit = 4字节,所以加4.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)
边信息大小:
对应Layer III,根据MPEG的版本,查下表可得,单位为字节:
MPEG 1
MPEG 2/2.5 (LSF)
立体声,联合立体声,双声道
32
17
单声道
17
9
7  Layer III的边信息(side information)
5.3.2 如果有,解析Xing头,并计算播放时间
VBR文件播放总时间 = 总的帧数 × 每一帧的采样个数÷ 采样率          【公式3】
计算出播放时间长度。
其中:
总的帧数(Number of Frames):
可以通过解析XING头,找出里面总帧数(Frames),这个字段,一般都是存在的。
每一帧的采样个数(Samples Per Frame):
根据前面解析MPEG,找到MPEG的版本,以及其实哪个Layer,然后根据表3.2.3 每帧的采样数,得到,每一帧有多少个采样。
采样率(Sampling Rate):
根据前面解析MPEG,找到对应的采样率索引 ,然后根据表4采样率,得到此采样率大小。
5.3.3 如果没XING头,定位出VBRI头位置,找VBRI头
如果找到,解析VBRI,然后和XING头算法类似,得到需要的值,再根据【公式3】计算出播放时间长度。
5.3.4 如果都没找到,说明是CBR,则计算CBR的播放时间
Xing和VBRI都无,则是CBR,然后就可以用【公式1】和【公式2】,计算出播放时间长度了。
其中【公式1】中所涉及到的:
每帧的采样数(Samples Per Frame):
同上,可根据MPEG头解析出来。
比特率(Bitrate):
同上,可根据MPEG头解析出来。
采样率(Sampling Rate):
根据MPEG头中解析出来的采样率索引,然后查表:表3.2.4 MPEG不同版本对应的采样率,即可。
填充大小(Padding Size):
根据MPEG帧头中的Padding位得知是0还是1。多数MP3,都没有padding,即为0.
计算出上面几个值后,可以根据:
帧大小 = ((每帧的采样数 ÷ 8 × 比特率) ÷ 采样率)+ 填充大小       【公式1】
计算出帧大小,然后再去计算:
文件大小(File Size):
这个自己计算就可以得到,我的理解是:
文件大小 = 总文件大小 – 头信息
这里的头信息,指的是ID3 V1或ID3 V2之类的头。
剩下的,总文件大小,这个不用多解释吧,就是整个读取出来的文件大小。
然后,就可以根据:
播放时间 = 文件大小 ÷ 比特率 × 8                                   【公式2】
计算出播放时间了。
的文件的内容组织结构
所以,总结起来,一般的MP3文件所包含的内容如下:
[ID3。。。] ID3 V2的头,大多数最新的MP3,都有这个头
[APE 头] 用于APE格式的头,现在也用于MPEG
第一帧包含:
1.MPEG 音频头, 固定的4 字节.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)
2.边信息,9/17/32 字节
[3.Xing 头] 8-120字节,如果是VBR,多数都有此Xing头,而且只有第一帧有
。。。。。音频数据。。。。
第二帧(帧头,边信息,数据。。。)
第三帧(帧头,边信息,数据。。。)
。。。
最后一帧(帧头,边信息,数据。。。)
[TAG 。。。] 128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头
注:[]号内的,表示,可选,即如果有的话。
8  MP3文件的内容组织结构
后记
最后想说的是,其实很无语,对于很多东西,尤其是计算机相关的技术,网上能找到的中文资料,多数都是说的不是太清楚。其中,包括我这里要找的,如何去计算VBR的播放时间,多数情况是,不论是去百度Google一下,还是去Google百度一下,找了半天,还是没看到有几个人能说清楚。让人越发感叹道,国内的计算机方面的技术,和国外,差的的确不是一点两点。人家把规范都定好了,过了N年了,结果咱们到现在,也没几个搞清楚咋回事。。。
因此,对于计算机方面的资料,尤其是涉及底层技术的,能详细解释清楚你的问题的,多数都是一些英文原版资料。所以,在此,再次,感谢一下原作者。。。
在此感谢
Zhao Ying
提醒,现已修正关于mpeg header的大小,不是固定的4字节,而是通常为4字节,当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节。
另外,有人提问,关于VBR总时长计算公式中的采样率,如果是变化的话,那么如果得到公式中的那个值的问题,目前我也不能理解,有待以后解决。
文章引用
【1】MPEG Audio Frame Header [登陆该页面后,有源码和程序供下载]
http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx
【2】MPlayer-1.0rc1 和 MPlayer-1.0rc2 的VBR patch
http://hi.baidu.com/serial_story/blog/item/9180ba35f07d1d1891ef39e8.html
【3】MPEG AUDIO FRAME HEADER (mp3 format)
http://www.datavoyage.com/mpgscript/mpeghdr.htm
【4】.MPEG Audio Layer I/II/III frame header
http://www.mp3-tech.org/programmer/frame_header.html
【5】MP3 Profi Info
http://www.goat.cz/index.php?path=MP3_MP3ProfiInfo
【6】MP3 Tech
http://www.mp3-tech.org/
【7】Media Player Classic播放VBR的MP3时的时间问题
http://xialulee.spaces.live.com/blog/cns!4ee324c8acfa82db!230.entry?wa=wsignin1.0&sa=835890451
【8】什么是MP3
http://wenwen.soso.com/z/q140151046.htm
【9】Variable bitrate
http://en.wikipedia.org/wiki/Variable_bitrate
【10】MPEG Audio Compression Basics
http://www.datavoyage.com/mpgscript/mpeghdr.htm
【11】ID3 tag version 2
http://id3.org/id3v2-00
【12】MP3: The Definitive Guide - Sample Chapter 2: How MP3 Works: Inside the Codec
http://oreilly.com/catalog/mp3/chapter/ch02.html转自: http://blog.163.com/againinput4@yeah/blog/static/12276427120098197322266/