目录
对于计算CBR的MP3的播放时间,其是Constant Bitrate,固定的比特率,每一帧的比特率也都是固定的同样的大小,所以,相对来说,很容易想得到,用文件大小,直接除于比特率,就可以得到文件的播放时间了,即就用如下公式可以计算MP3的播放时间:
公式 4.1. CBR播放时间(CBR Duration)
CBR Duration
= File Size(Byte) × 8 bit/Byte ÷ (Bitrate(K bit/s)× 1000 bit/Kbit )
CBR播放时间
= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)
其中:
严格地说,应该是MP3的文件总大小,减去MP3的Tag的大小,即
文件大小 = 总的MP3文件大小 – MP3的Tag大小
其中,MP3的Tag,往往和MP3文件总大小相比,几乎可以忽略不计,所以,一般也可以直接用总的MP3为文件大小,直接来计算:
文件大小 = 总的MP3文件大小
可以通过解析MP3文件的第一帧的MPEG的帧头,得到比特率的索引值,然后查比特率索引表,即可得到比特率是多少。
所以,可以看出,对于CBR的文件,可以用上面的公式,获得MP3文件大小后,再去解析第一帧的MPEG帧头,得到比特率索引值,查表得到比特率的值,然后就算出整个CBR MP3文件的播放时间。
另外,多说一句,我原先以为,还有另外一种计算方法,即:
“总帧数乘于每一帧的时长法”
总的时长 = 每一帧的时长 * 总的帧数
就是先计算每一帧的时间长度,再计算一共有多少帧,然后将两者相乘,即可得到文件总时长。
其中:
= 每一帧的采样个数 * 每一采样的时长
= 每一帧的采样个数 * (1 / 每一帧的采样频率)
而
总的帧数
= 文件大小 / 单个帧的大小
= 文件大小(字节)* 8比特/字节 / ((每个帧的时长 * 比特率(千比特/秒) * 1000比特/千比特))
但是后来发现,上面这个计算总的帧数的方法,其实是不精确的,是把每一帧的4字节的MPEG帧头漏掉了。
因此,才会有之前的想法,认为这两种计算CBR的MP3的播放时间的计算公式是同一种:
“此法,其实和上面的是同一个方法,因为上面两个等式相乘之后,即为:
总的时长
= 每一帧的时长 * 总的帧数
=每一帧的时长 * [总的文件大小(字节)* 8比特/字节 / ( (每个帧的时长 * 比特率(千比特/秒) * 1000比特/千比特) )]
= [总的文件大小(字节)* 8比特/字节 / [ 比特率 千比特/秒 * 1000比特/千比特)]
还是和上面的方法是,是同一个公式。
”而对于上面的总的帧数的计算方法,真正正确的是:
总的帧数
= 文件大小 ÷ 单个帧的大小
= 文件大小 ÷ (帧头 + 帧数据)
= 文件大小 ÷ (固定的4字节 + 帧数据)
= 文件大小(字节)× 8比特/字节 ÷ ( 4 + [ 每个帧的时长 × 比特率(千比特/秒)× 1000(比特/千比特)] )
方法二,即为:
CBR播放时间
= 每一帧的时长 × 总的帧数
= (每一帧的采样个数 ×(1 / 每一帧的采样频率))×( 文件大小(字节)× 8比特/字节 ÷ ( 4 + [ 每个帧的时长 × 比特率(千比特/秒)× 1000(比特/千比特)] ) )
= 文件大小(字节)× ( 4 + (每一帧的采样个数÷每一帧的采样频率)× 比特率(千比特/秒)× 1000(比特/千比特)÷ 8比特/字节] ))×(每一帧的采样个数÷每一帧的采样频率)
其中:
文件大小:是总的MP3文件大小,减去MP3的Tag的大小。
也因此,最开始的原以为的第二种方法,和第一种,是同一种的想法,其实是错误的。正确的理解是,第二种方法的确是另外一个方法,而且更准确。
因为第一种方法:
CBR播放时间
= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)
中的比特率,只是针对每一帧的音频的数据的,而并不包括4字节的帧头,而(参见上面的解释):“常见MPEG帧的音频数据大小是418字节”,所以,这样比较起来,至少是,没418+4=422的这一个帧,其中只有418个是真正的音频数据,而比特率,指的只是这个帧数据的比特率,并不包括4字节的帧头,如果也包含进去了,那么则产生了误差,误差大概是4/(418+4)=0.95%,即大概是百分之一的误差。
即,方法一,计算出来的CBR的播放时间,大概有1%的误差。
而第二种方法:
CBR播放时间
= 每一帧的时长 × 总的帧数
= 文件大小(字节)× ( 4 + (每一帧的采样个数÷每一帧的采样频率)× 比特率(千比特/秒)× 1000(比特/千比特)÷ 8比特/字节] ) )×(每一帧的采样个数÷每一帧的采样频率)
就把每一帧的4字节的帧头,也计算进去了,好处是计算出来的播放时间更加精确,坏处是,计算起来,相对第一种方法来说,比较麻烦。
而第一种方法,虽然有大概1%的误差,但是很容易计算。所以现实中,常用第一种方法。
我找了个CBR的MP3,用千千静听去查看其播放时间,推断出,其用的是第一种方法计算的。
具体推断过程如下:
(此处为了方便计算,忽略了MP3的Tag的大小,而把整个文件大小看作是MP3的所有帧的总大小)
该MPEG 1- Layer III的MP3:
文件大小=11777537 字节
采样个数:1152
采样率:44100Hz
比特率:96kbps
【方法一】
总时长
= 11777537 × 8 ÷(96 × 1000)
= 981.46
【方法二】
总时长
= 11777537÷(4 + (1152÷44100)×(96×1000÷8) )×(1152÷44100)
= 11777537÷(4 + 313.47)×0.02612
≈11777537÷(4 + 314)×0.02612
= 11777537÷318×0.02612
= 967.48
即,方法二,是精确的MP3的总时长,为967.48,而方法一,计算出来的是有误差的981.46,误差为 (981.46-967.48)/ 967.48=1.34%,即大概为1%。
而千千静听查看到此MP3的播放时间为:16:20.454 = 980.454秒,
考虑到我们上面用方法一算出来的MP3的播放时间是981.46秒,是把MP3的Tag也算进去了,所以去掉Tag的大小,就是千千静听上看到的980.454秒了。
【总结】
因此,虽然方法二计算出来的播放时间更准确,但是实际上,为了更简便的计算,往往采用了误差大概只有1%,(一般用户也可以接受此误差),的第一种方法:
CBR播放时间
= 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特)