您的位置:首页 > 编程语言 > VB

MPEG简介 + 如何计算CBR/VBR MP3的播放时间

2013-03-01 14:51 381 查看



【此文目的】
1.了解MPEG相关知识
2.了解MP3的常见术语含义
3.详解VBR MP3的帧头格式及含义
4.搞懂如何去计算CBR和VBR的MP3文件的播放时间(duration)
[align=left] [/align]
[align=left]【目录】[/align]
1.MPEG的相关知识
1.1
MPEG是啥
1.2
为啥没了MPEG-3
1.3
MPEG2.5又是啥
1.4
MPEG中不同帧之间的关系
1.5
MPEG-1和MPEG-2音频特性
1.5.1
MPEG-1音频(ISO/IEC 11172-3)
1.5.2
MPEG-2音频(ISO/IEC 13813-3)
1.6 什么是ISO/IEC
11172-3和ISO/IEC 13818-3
2
MP3中常见的术语
2.1 啥叫MP3
2.2 什么是LSF
2.3 什么是帧(frame)
2.4 什么是帧头(header)
2.5 啥是CBR和VBR
2.6 比特率(bitrate)
2.7 边信息(side
information)
3
VBR MP3的帧头格式详解
3.1
VBR MP3的帧头类型
3.2
MPEG音频帧格式及其含义介绍
4
MP3的播放时间的计算公式及XING和VBRI头介绍
4.1
CBR的MP3的播放时间(duration)计算公式
4.2
VBR的MP3的播放时间(duration)计算公式
4.2.1
Xing TAG / Xing头(header)
4.2.2
VBRI头(header)
5 计算CBR和VBR的MP3文件的播放时间的步骤
5.1 定位到MPEG的帧头的位置
5.2 解析MPEG帧头,获取必要信息
5.3 判断是VBR还是CBR,根据公式计算播放时间
5.3.1 定位出Xing头
5.3.2 如果有,解析Xing头,并计算播放时间
5.3.3 如果没XING头,定位出VBRI头位置,找VBRI头
5.3.4 如果都没找到,说明是CBR,则计算CBR的播放时间
6
MP3的文件的内容组织结构
7 后记
8 文章引用
[align=left] [/align]
[align=left]【表格索引】[/align]
表1 MPEG音频帧头的格式
表2 比特率
表3 每帧的采样数
表4 MPEG不同版本对应的采样率
表5 XING 头
表6 VBRI头
表7 Layer
III的边信息(side information)
表8 MP3文件的内容组织结构
[align=left] [/align]
1.MPEG的相关知识

想要了解如何计算VBR的MP3的播放时间之前,要简单了解一些MP3相关的一些基本概 念,主要是MPEG的相关知识和编解码的一些知识:
1.1 MPEG是啥

MPEG全名Moving Pictures Experts Group,动态图像专家组,简单说就是一个专家组,专门研究一些音视频规范的,所以才叫专家,不是我们国家的“砖家”哦。这个专家组是在ISO/IEC(International Standards Organization/International Electrotechnical Commission,国际标准化组
织/国际电工委员会)联合指导下成立的。这个组,专门去研究出一个数字音视频的压缩相关的规范,所以最后 研究出适用于不同应用环境的N多规范。

和事物发展的过程类似,研究出这么多的规范也是,不同时期,不同的版本,针对不同的应用。也是由简到 繁。并且,命名规则都是,按照阿拉伯数字从小到大的:MPEG 1,MPEG2,MPEG4,MPEG-7,最新版本,好像都有MPEG-21了。
1.2为啥没了MPEG-3
[align=left]估计有人纳闷了,为啥中间的MPEG3咋没了呢?[/align]

是没MPEG3,当然,不是被刘谦变魔术变没了, 而是由于当时设计者没有规划好,导致已经设计好的MPEG2,性能太好了,都能干本来打算让MPEG3干的活了,所以后来干脆就不去再设计MPEG3了,原定计划就取消了,也就没了MPEG3。看来这个MPEG3,待遇貌似不比胎死腹中好多少。对于很多人误解的,以为MP3就是MPEG-3,也就更错的离谱了。关于MP3的名称来历,下面会再解释。
1.3 MPEG2.5又是啥

MPEG2.5,简单说就是出身不正,不是官方推出的规范。MPEG 2.5是针对MPEG2的一个非官方的扩展版本,支持更低 的采样率。关于其更多解释,网上找到这些:

MPEG声音标准提供三个独立的压缩层次:Layer I、Layer II和Layer III。用户具体选哪个Layer,可以根据自己的 要求,在权衡复杂性和声音质量之后,做出自己的选择。

A.Layer I的编码器最为简单,编码器的 输出数据率为384 kb/s,主要用于小型数字盒式磁带(digital compact cassette,DCC)。

B.Layer II的编码器的复杂程度属中 等,编码器的输出数据率为256 kb/s~192 kb/s,其应用包括数字广播声音(digital broadcast audio,DBA)、数字音乐、CD-I(compact disc-interactive)和VCD(video
compact disc)等。

C.Layer III的编码器最为复杂,编码 器的输出数据率为64 kb/s,主要应用于ISDN上的声音传输。 MPEG-1 Layer III支持的采样率为32,44.1,48khz,比 特率支持32---320kbps MPEG-2 Layer III支持的采样率为16,22.05,24khz,比特率支持8---160kbps

Fraunhofer对此又进行扩展,将原来MPEG-2所支持的低采样 率再除以2,得到: 8, 11.025, 和 12 kHz,比特率跟MPEG-2相同,称为 "MPEG 2.5"。
1.4 MPEG中不同帧之间的关系

对于Layer I和Layer II,不同的帧之间,是互相独立的。也就意味着,你可以任意截取MPEG的音频文件,然后找到第一个正确的帧头,然后解码,然后接下来放余下的帧,这样都可以正确的播放。而 对于Layer III,所有帧不保证都是互相独立的。由于可能用到“字节蓄水池(byte reservoir)”,即内部的一个数据缓存,这些帧,都是相关的,最差情况下,要连续缓冲保存9个帧,才能对第一帧解码。
1.5 MPEG-1和MPEG-2音频特性
1.5.1 MPEG-1音频(ISO/IEC
11172-3)
[align=left]其描述了三层音频编码,具有如下特性:[/align]
A.一个或两个音频声道
B.采样率32KHz、44.1KHz或48KHz
C.比特率从32Kbps到448Kbps
D.每一层都有其自己的其他特点。
1.5.2 MPEG-2音频(ISO/IEC
13813-3)
[align=left]其包含了对MPEG-1的两种扩展。通常称为MEGP-2/低采样率(LSF)和MPEG-2/多声道(Multichannel)。[/align]
[align=left]1.5.2.1 MPEG-2/LSF的特性:[/align]
A.一个或两个音频声道
B.采样率只有MPEG-1的一半
C.比特率从8Kpbs到256Kbps
[align=left]1.5.2.2 MPEG-2/多声道,的特性:[/align]
A.多达5个全范围的音频声道和一个LFE(Low Frequency Enhancement,也叫做 重低音)声道
B.采样率和MPEG-1相同
C.对于5.1声道,最高的比特率可达1Mpbs
1.6 什么是ISO/IEC
11172-3和ISO/IEC 13818-3

由于MPEG只是ISO/IEC下面的一个组织,所以,关于MPEG音频部分的规范,也 多是出自ISO/IEC之手。
[align=left]因此,ISO/IEC 11172和ISO/IEC 13818,其实就是MPEG1的音频部分和MPEG-2的别名。[/align]

另外,由于MPEG-1和MPEG-2,每个都分好几个部分,其中,第三部分是关于音频的。所以,ISO/IEC 11172-3和ISO/IEC 13818-3,就分别对 应着MPEG-1的音频,MPEG-2的音频,也就是我们常常提到的MPEG的音频文件所对应的规范。
2 MP3中常见的术语
[align=left]知道了MPEG的来龙去脉后,在了解MP3的播放时间如何计算之前,也要知道其他一些,和MP3相关的知识,和常见的术语:[/align]
2.1 啥叫MP3
[align=left]注意,这个MP3,不是MPEG-3,但是为何叫MP3,是因为:[/align]

MPEG规范中规定了,每一个版本的MPEG,比如MPEG1,MPEG2等,都有三种不同的Layer,不同Layer的序号命令是以罗马数字的,所以叫 做Layer I, Layer II, Layer III。
[align=left]其中,最常见的就是MPEG 1 的Layer III,就是众所周知的MP3。[/align]

根据事物发展由简到繁的规律,我们知道,Layer III,相对Layer I和Layer II,其有着更复杂的压缩算法。正是其相对复杂,用了很多算法,比如声学上的掩蔽效应(masking effect),Huffman压缩等,使得尽可能保持音质的 基础上,极大地减少了音频文件大小,也就是说,尽量让你听上去音频声音和音质都没啥变化,但是MP3的文件大小,相对于原先没处理的,或者其他格式的,比如WAV格式等,要小很多,方便大家互相传播交流。这也是MP3如此流行的主要原因之一。
2.2 什么是LSF
[align=left]MPEG2/2.5 也常被简称为LSF(Low Sampling Frequencies),低采样率。[/align]
2.3 什么是帧(frame)
[align=left]通俗点说,就是一段连续的数据块。对于MPEG音频文件本身,并没有什么文件头,而是由很多数据块所组成,这样的单个的数据块,就叫做一个(数据/音频)帧(frame)。MP3文件,同理,由很多个帧所组成。帧,也是其他很多音视频技术中的基本单位。[/align]
2.4 什么是帧头(header)

每一个帧里面,包含了帧头和音频数据。帧头,就是在帧的头部,有一定长度的数据,用于描述改帧音频的 一些参数,用于解码器对此音频帧进行解码。对于MPEG的帧头,是固定的32 比特,即4字节。
2.5 啥是CBR和VBR

CBR(Constant bitrate)固定(/不变)比特率,VBR(Variable bitrate ),不 定(/可变)比特率,变与不变,指的是MP3的比特率是否固定。音频文件可以被编码成CBR或VBR。VBR意思就是,每一帧的比特率不同。由于VBR可以在需要的时候,采用高比特率,所以,一般来说,VBR的音质比CBR的要好。

很多种音视频文件,都可以按照VBR来压缩,比如MP3、WMA、Vorbis OGG、AAC,MPEG-2的视频等。VBR的优点是,和CBR相比,用更小的空间,即文件更小,实现 更高的音质。缺点是,编码复杂度增加,编码需要更长时间,而有些硬件编码器可能和VBR不兼容。
2.6 比特率(bitrate)

即每秒包含/播放了多少个比特的数据。比特率常用Kbps(kilo bits per second, 千比特每秒)表示。此处的千字节=1000字节,而不是1024.
2.7 边信息(side
information)

在MPEG音频的帧头后面,有一些解码器会用到 的一些信息,用于解码器控制音频流的播放,它就叫做 边信息。不同版本的MPEG的Layer III的边信息的大小,详见后面的表。
3 VBR MP3的帧头格式详解
3.1 VBR MP3的帧头类型
[align=left]VBR MP3的帧头主要有两种,XING和VBRI。[/align]
[align=left]关于它们的具体格式和含义,下面会详细解释。[/align]

另外常常会提到的是,关于V1和V2两个版本的ID3 头信息,这个主要是用于记录音频文 件的一些描述信息,比如歌手,专辑,曲风等,和对音频文件解码,没有直接关系。属于存储音频文件附属信息的头。

ID3的V1和V2,不会同时存在。如果存在ID3的话,一般ID3 V1会放在音频文件的最后,大小128个字节,其中前三个字 节是字符“TAG”。ID3 V2放在音频文件的开头处,前三个 字节是字符“ID3”。
[align=left]关于ID3的具体格式,请参考附录中的引用文献。[/align]
[align=left]由于此处介绍的内容,目的是尽快,尽可能精确地去估算MP3文件的(持续)播放时间。所以,此处不涉及,关于如何去编解码实际的音频数据。[/align]
3.2 MPEG音频帧格式及其含义介绍

MPEG音频文件,由一个个的帧(Frame)组成。每一帧都 有个帧头(Frame Header),位于该帧的最开始处,接下来的是音频数据。音频数据多数都是包含了 固定数目 的 音频采样 (Sample)。正是基于这个特性,才有后面的VBR的播放时间计算公式。
[align=left]前面介绍过了,目前,存在的三种Layer的MPEG音频,尽管他们的压缩方法各不相同,但是帧头格式都一样。[/align]
[align=left]这些帧,由一个个的Slot(槽)组成。[/align]
[align=left]Layer I中,一个Slot是4个字节,在Layer II和Layer III中,一个Slot是一个字节。[/align]
[align=left]MPEG帧头的格式及含义[/align]
[align=left] [/align]
[align=left]位置[/align]
[align=left]长度[/align]
[align=left]含义[/align]
[align=left]示例[/align]
[align=left]0[/align]
[align=left]11[/align]
[align=left]用于同步帧,找到此帧头(所有位均置1)[/align]
1111 1111 111
[align=left]11[/align]
[align=left]2[/align]
[align=left]音频版本ID (参见 表3.2)[/align]

00 - 版本是MPEG 2.5 (MPED-2的非官方 扩展版本)

01 – 保留

10 – 版本是MPEG 2 (ISO/IEC 13818-3)

11 – 版本是MPEG 1 (ISO/IEC 11172-3)
[align=left]11[/align]
[align=left]13[/align]
[align=left]2[/align]
[align=left]Layer 的索引[/align]

00 – 保留

01 - Layer III

10 - Layer II

11 - Layer I
[align=left]01[/align]
[align=left]15[/align]
[align=left]1[/align]
[align=left]保护位(Protection bit)[/align]

0 – 包含16位的CRC校验

1 – 无CRC
[align=left]1[/align]
[align=left]16[/align]
[align=left]4[/align]
[align=left]比特率索引 (参见 表2.1.3)[/align]
[align=left]1001[/align]
[align=left]20[/align]
[align=left]2[/align]
[align=left]采样率索引 (参见表2.1.2)[/align]
[align=left]11[/align]
[align=left]22[/align]
[align=left]1[/align]
[align=left]填充位[/align]
[align=left]如果设置了,就会对每帧数据填充一个slot (对于帧大小的计算很重要)[/align]
[align=left]0[/align]
[align=left]23[/align]
[align=left]1[/align]
[align=left]私有位 (仅用于标示性的)[/align]
[align=left]1[/align]
[align=left]24[/align]
[align=left]2[/align]
[align=left]声道的模式[/align]

00 – 立体声

01 – 混合立体声

10 – 双声道 (两个单声道)

11 – 一个声道 (单声道)

注: 双声道文件由两个独立的单声道所组成。 大多数解码器把双声道输出成立体声,但是实际上,不是所有的双声道都是立体声的。
[align=left]01[/align]
[align=left]26[/align]
[align=left]2[/align]
[align=left]模式扩展 (仅用于联合立体声) (参见 表 2.1.6)[/align]
[align=left]00[/align]
[align=center]表1 MPEG音频帧头的格式[/align]

注意,此处如果上表中的保护位Protection bit==0,那么紧跟着此MPEG的Header之后,会有16bit=2Bytes的CRC,

用于校验此帧头是否出错。主要目的是,以防万一,数据在传输过程中,或者常见的mp3文件拷贝来拷贝 去的过程中,出现此帧头数据有些位出错了,此时,你收到此mp3文件,解码此帧头,用后面16bit的crc和你实际用crc算法算出来的进行比较,就会 发现不一样,就说明此帧头有误。实际情况,很少出错。而且,实际中,很少用到此保护位,很少在帧头后面跟随16bit的CRC。

在MPEG标准中,描述了一种自由格式(free format),这种自由格式意思为用一个固定比特率对文件进行编码,而此固定的比特率不是我们表中预定义好的。 一般的解码器都无法解码这类音频文件。

[align=left]下面是比特率索引表,(单位:Kbit/sec)。[/align]
[align=center]比特率[/align]
[align=center]索引[/align]
MPEG 1
MPEG 2, 2.5 (LSF)
Layer I
Layer II
Layer III
Layer I
Layer II & III
[align=center]0000[/align]
[align=center]空闲[/align]
[align=center]0001[/align]
[align=center]32[/align]
[align=center]32[/align]
[align=center]32[/align]
[align=center]32[/align]
[align=center]8[/align]
[align=center]0010[/align]
[align=center]64[/align]
[align=center]48[/align]
[align=center]40[/align]
[align=center]48[/align]
[align=center]16[/align]
[align=center]0011[/align]
[align=center]96[/align]
[align=center]56[/align]
[align=center]48[/align]
[align=center]56[/align]
[align=center]24[/align]
[align=center]0100[/align]
[align=center]128[/align]
[align=center]64[/align]
[align=center]56[/align]
[align=center]64[/align]
[align=center]32[/align]
[align=center]0101[/align]
[align=center]160[/align]
[align=center]80[/align]
[align=center]64[/align]
[align=center]80[/align]
[align=center]40[/align]
[align=center]0110[/align]
[align=center]192[/align]
[align=center]96[/align]
[align=center]80[/align]
[align=center]96[/align]
[align=center]48[/align]
[align=center]0111[/align]
[align=center]224[/align]
[align=center]112[/align]
[align=center]96[/align]
[align=center]112[/align]
[align=center]56[/align]
[align=center]1000[/align]
[align=center]256[/align]
[align=center]128[/align]
[align=center]112[/align]
[align=center]128[/align]
[align=center]64[/align]
[align=center]1001[/align]
[align=center]288[/align]
[align=center]160[/align]
[align=center]128[/align]
[align=center]144[/align]
[align=center]80[/align]
[align=center]1010[/align]
[align=center]320[/align]
[align=center]192[/align]
[align=center]160[/align]
[align=center]160[/align]
[align=center]96[/align]
[align=center]1011[/align]
[align=center]352[/align]
[align=center]224[/align]
[align=center]192[/align]
[align=center]176[/align]
[align=center]112[/align]
[align=center]1100[/align]
[align=center]384[/align]
[align=center]256[/align]
[align=center]224[/align]
[align=center]192[/align]
[align=center]128[/align]
[align=center]1101[/align]
[align=center]416[/align]
[align=center]320[/align]
[align=center]256[/align]
[align=center]224[/align]
[align=center]144[/align]
[align=center]1110[/align]
[align=center]448[/align]
[align=center]384[/align]
[align=center]320[/align]
[align=center]256[/align]
[align=center]160[/align]
[align=center]1111[/align]
[align=center]保留[/align]
[align=center]表2 比特率[/align]
[align=left]为了计算帧大小,我们需要知道,每一帧里面包含多少个采样,即采样数/帧(sample per frame)。[/align]
[align=center] [/align]
MPEG 1
MPEG 2 (LSF)
MPEG 2.5 (LSF)
Layer I
[align=center]384[/align]
[align=center]384[/align]
[align=center]384[/align]
Layer II
[align=center]1152[/align]
[align=center]1152[/align]
[align=center]1152[/align]
Layer III
[align=center]1152[/align]
[align=center]576[/align]
[align=center]576[/align]
[align=center]表3 每帧的采样数[/align]
[align=left]根据MPEG帧头里面的索引,对应的,不同版本的MPEG的采样率也是不同的:[/align]
[align=center]采样率索引[/align]
[align=center]MPEG 1[/align]
[align=center]MPEG 2 (LSF)[/align]
[align=center]MPEG 2.5 (LSF)[/align]
[align=center]00[/align]
[align=center]44100 Hz[/align]
[align=center]22050 Hz[/align]
[align=center]11025 Hz[/align]
[align=center]01[/align]
[align=center]48000 Hz[/align]
[align=center]24000 Hz[/align]
[align=center]12000 Hz[/align]
[align=center]10[/align]
[align=center]32000 Hz[/align]
[align=center]16000 Hz[/align]
[align=center]8000 Hz[/align]
[align=center]11[/align]
[align=center]保留[/align]
[align=center]表4 MPEG不同版本对应的采样率[/align]
4 MP3的播放时间的计算公式及XING和VBRI头介绍
4.1 CBR的MP3的播放时间(duration)计算公式
[align=left]因此,帧大小可以用如下公式计算:[/align]

Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size
[align=left]帧大小 = ((每帧的采样数 ÷ 8 × 比特率) ÷ 采样率)+ 填充大小 【公式1】[/align]
[align=left] [/align]

由于舍入误差,官方的计算帧大小的方法和此稍有不同。根据ISO标准,应该以slot为单位进行计算,然后对结果取整,再 乘于slot的大小。

用如下公式可以计算MP3的播放时间,以秒为单 位:

CBR Duration = File Size / Bitrate * 8

播放时间 = 文件大小 ÷ 比特率 × 8 【公式2】

对于CBR的文件,可以用上面的公式,通过第一 帧,算出整个文件的播放时间。
[align=left]对于VBR,要用另外的公式。下面将会详细介绍。[/align]
4.2 VBR的MP3的播放时间(duration)计算公式

想要计算VBR的MP3的播放时间,我们必须要知道整个文件的平均比特率(average bitrate)。此平均比特率,一般来说,往往和第一帧的比特率相差很大。因为MP3音乐的开头部分,很多是用于现实标题的一些几乎无声的数据。也就意味着,如果解码器对于VBR文件,按照CBR文件来解码,而去通过第一帧去计算整个 文件的播放时间,那么往往结果和实际相差很大。这也就是后面引用中一个帖子里面遇到的情况,即,Media Player
Classic播放VBR的MP3时的时间问题。

为了得到平均比特率,你必须遍历整个文件的所有帧,然后再才 能计算出来,即算出一共有多少帧,将每一帧的比特率加起来得到个总和,用总和去除于帧数,就是平均比特率了。
[align=left]由于这个做法效率太低,所以就有了VBR的头这个东西,其放在第一帧帧头的后面的。[/align]

其包含了此VBR一共有多少帧,有了总的帧数,你就可以 用下面的公式去计算播放时间了:

VBR Duration = Number of Frames * Samples Per Frame / Sampling Rate
[align=left]VBR文件播放总时间=总的帧数 × 每一帧的采样个数÷ 采样率 【公式3】[/align]

此外,VBR的头中,往往还包含了一个用于定位的TOC(table of content)目录 表。即用于在快进或快退的时候,通过表中的信息,可以方便地定位到对应的位置。如果没有此TOC表,需要单独去计算出对应的位置,比较麻烦。
4.2.1 Xing TAG / Xing头(header)
[align=left]此tag由XING公司推出的算法/规范,所以叫做XING。[/align]
[align=left]对于大多数的VBR文件都加了此头,但并不全是。此头位于MPEG音频头后面的某个特定位置。包好了此XING头的第一个帧,其后的数据是空的,所以即使解码器没有考虑到此头,也可以正常处理此帧。对于Layer III的文件来说,比如常见的MP3,此VBR放在边信息(side information)之后。[/align]
[align=left] [/align]
[align=left]下表是XING头的具体格式及含义:[/align]

[align=center]位置[/align]
[align=center]长度(字节)[/align]
[align=center]含义[/align]
[align=center]示例[/align]
0
4
4个ASCII字符的VBR头 ID,要么是Xing,要么是Info,无NULL结尾(普通字符串都以NULL,即\0结尾)
[align=center]'Xing'[/align]
4
4
存放一个标志,用于表示接下来存在哪些域/字段,各字段逻辑或的结果.
0x0001 - 存在总帧数(Frames)字段
0x0002 - 存在文件大小(Bytes)字段
0x0004 –存在TOC字段
0x0008 – 存在音频质量指示字段
[align=center]0x0007[/align]
[align=center]就表示下面存在总帧数,文件大小总字节数,TOC表[/align]
8
4
总帧数(Frames),大端[可选]
[align=center]7344[/align]
8或12
4
文件总大小,单位字节,大端[可选]
[align=center]45000[/align]
8,12,16
100
TOC表,大端[可选]
[align=center] [/align]
8或12, 16, 108, 112,116
4
音频质量指示,最差0,最好100,大端[可选]
[align=center]0[/align]
[align=center]表5 XING 头[/align]
[align=left] [/align]

虽然知道了XING头的具体含义,可以去根据具体的值, 解析出对应的含义了,但是,由于

其是放在side information之后的, 所以,要先定位,找到XING头,关于其位置,用如下公式计算:
[align=left]XING头位置 = MPEG头位置 + MPEG帧头大小 + 边信息大小[/align]

= MPEG头位置 + 4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC) + 边信息大小 【公式4】
[align=left]注:[/align]

根据头的格式,Xing头里面必须包含ID和flag这两个段。其他字段都是可选的,是否 包含,要看flag的值。有时候这个Xing头,CBR里面也有,此时,前面的ID的值就是Info,而不是Xing了。
4.2.2 VBRI头(header)

据了解,目前此头信息,只有用Fraunhofer的编码 器生成的MPEG音频文件,才会用到此头。其和Xing头不一样,其放在 第一个MPEG头的后面,大小正好是32字节。其位置,长度和示 例,都是以字节为单位。
[align=left]下表是VBRi头的具体格式及含义,单位为字节:[/align]

[align=center]位置[/align]
[align=center]长度[/align]
[align=center]含义[/align]
[align=center]示例[/align]
[align=center]0[/align]
[align=center]4[/align]
4个ASCII字符的VBR头ID:“VBRI”无NULL结尾
[align=right]“VBRI”[/align]
[align=center]4[/align]
[align=center]2[/align]
版本ID,大端,类型:DWORD
[align=right]1[/align]
[align=center]6[/align]
[align=center]2[/align]
延迟,类型:float
[align=right]7344[/align]
[align=center]8[/align]
[align=center]2[/align]
音频质量指示
[align=right]75[/align]
[align=center]10[/align]
[align=center]4[/align]
文件总大小,大端,类型:DWORD
[align=right]45000[/align]
[align=center]14[/align]
[align=center]4[/align]
总的帧数,大端,类型:DWORD
[align=right]7344[/align]
[align=center]18[/align]
[align=center]2[/align]
TOC表的表项数目,大端,类型:WORD
[align=right]100[/align]
[align=center]20[/align]
[align=center]2[/align]
TOC表项的缩放因子,大端,类型:DWORD
[align=right]1[/align]
[align=center]22[/align]
[align=center]2[/align]
单个TOC表项的大小,单位字节,最大为4,大端,类型:DWORD
[align=right]2[/align]
[align=center]24[/align]
[align=center]2[/align]
帧数/表项,大端,类型:WORD
[align=right]845[/align]
[align=center]26[/align]
[align=center] [/align]
用于检索的TOC表,整型值,可以通过每个表项大小乘于表项个数得到此TOC表的总大小,大端
[align=right] [/align]
[align=center]表6 VBRI头[/align]
5 计算CBR和VBR的MP3文件的播放时间的步骤
[align=left]此处只是大概总结一下,具体解析出播放时间,需要哪些步骤。其对应的代码,可以去文章引用中的【1】,注册登录后,可以下载源代码,自己看,就知道了。[/align]
[align=left]或者,可以去参考引用【2】中的Mplayer的VBR 的patch,里面写的更加简单,但是也更容易看明白。[/align]
5.1 定位到MPEG的帧头的位置

如果文件开始没有ID3 V2的头信息,那 么一般MPEG的帧头位置是0,当然,具体还是要根据帧头中的同步位(sync bit),共11位去定位找到帧头。
5.2 解析MPEG帧头,获取必要信息

主要是根据帧头格式,解析出MPEG的版本,MPEG的Layer,以及采样率,比特率等信息,用于 后面的解码和计算播放时长。
5.3 判断是VBR还是CBR,根据公式计算播放时间
[align=left]解析完MPEG头之后,按照如下步骤去判断是CBR还是VBR,并计算出播放时长:[/align]
5.3.1定位出Xing头
[align=left]根据:[/align]

XING头位置 = MPEG头位置 + 4(或 6,当Protection bit==0时,帧头后会有16bit=2byte的CRC) + 边信息大小 【公式4】
[align=left]计算定位到XING头所在位置。上式中:[/align]
[align=left]MPEG头位置:[/align]
[align=left]如果没有ID3 V2这类的信息的话,那么MPEG头位置就是文件的最开始,即0的位置。[/align]
[align=left]MPEG帧头大小:[/align]

一般为固定的32 bit = 4字节,所以加4.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)
[align=left]边信息大小:[/align]
[align=left]对应Layer III,根据MPEG的版本,查下表可得,单位为字节:[/align]

[align=center] [/align]
MPEG 1
MPEG 2/2.5 (LSF)
[align=center]立体声,联合立体声,双声道[/align]
[align=center]32[/align]
[align=center]17[/align]
[align=center]单声道[/align]
[align=center]17[/align]
[align=center]9[/align]
表7 Layer
III的边信息(side information)
5.3.2如果有,解析Xing头,并计算播放时间

VBR文件播放总时间=总的帧数 × 每一帧的采样个数÷ 采样率 【公式3】
[align=left]计算出播放时间长度。[/align]
[align=left]其中:[/align]
[align=left]总的帧数(Number of Frames):[/align]
[align=left]可以通过解析XING头,找出里面总帧数(Frames),这个字段,一般都是存在的。[/align]
[align=left]每一帧的采样个数(Samples Per Frame):[/align]
[align=left]根据前面解析MPEG,找到MPEG的版本,以及其实哪个Layer,然后根据表3.2.3 每帧的采样数,得到,每一帧有多少个采样。[/align]
[align=left]采样率(Sampling Rate):[/align]
[align=left]根据前面解析MPEG,找到对应的采样率索引 ,然后根据表4采样率,得到此采样率大小。[/align]
5.3.3如果没XING头,定位出VBRI头位置,找VBRI头
[align=left]如果找到,解析VBRI,然后和XING头算法类似,得到需要的值,再根据【公式3】计算出播放时间长度。[/align]
5.3.4如果都没找到,说明是CBR,则计算CBR的播放时间
[align=left]Xing和VBRI都无,则是CBR,然后就可以用【公式1】和【公式2】,计算出播放时间长度了。[/align]
[align=left]其中【公式1】中所涉及到的:[/align]
[align=left]每帧的采样数(Samples Per Frame):[/align]
[align=left]同上,可根据MPEG头解析出来。[/align]
[align=left]比特率(Bitrate):[/align]
[align=left]同上,可根据MPEG头解析出来。[/align]
[align=left]采样率(Sampling Rate):[/align]

根据MPEG头中解析出来的采样率索引,然后查 表:表3.2.4 MPEG不同版本对应的采样率,即可。
[align=left]填充大小(Padding Size):[/align]
[align=left]根据MPEG帧头中的Padding位得知是0还是1。多数MP3,都没有padding,即为0.[/align]
[align=left]计算出上面几个值后,可以根据:[/align]
[align=left]帧大小 = ((每帧的采样数 ÷ 8 × 比特率) ÷ 采样率)+ 填充大小 【公式1】[/align]
[align=left]计算出帧大小,然后再去计算:[/align]
[align=left]文件大小(File Size):[/align]
[align=left]这个自己计算就可以得到,我的理解是:[/align]
[align=left]文件大小= 总文件大小 – 头信息[/align]
[align=left]这里的头信息,指的是ID3 V1或ID3 V2之类的头。[/align]
[align=left]剩下的,总文件大小,这个不用多解释吧,就是整个读取出来的文件大小。[/align]
[align=left]然后,就可以根据:[/align]

播放时间 = 文件大小 ÷ 比特率 × 8 【公式2】
[align=left]计算出播放时间了。[/align]
6 MP3的文件的内容组织结构

所以,总结起来,一般的MP3文件所包含的内容如 下:
[align=left] [/align]

[align=left][ID3。。。] ID3 V2的头,大多数最新的MP3,都有这个头[/align]
[align=left][APE 头] 用于APE格式的头,现在也用于MPEG[/align]
[align=left]第一帧包含:[/align]

1.MPEG 音频头, 固定的4 字 节.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)
[align=left]2.边信息,9/17/32字节[/align]
[align=left][3.Xing 头] 8-120字节,如果是VBR,多数都有此Xing头,而且只有第一帧有[/align]
[align=left]。。。。。音频数据。。。。[/align]
[align=left]第二帧(帧头,边信息,数据。。。)[/align]
[align=left]第三帧(帧头,边信息,数据。。。)[/align]
[align=left]。。。[/align]
[align=left]最后一帧(帧头,边信息,数据。。。)[/align]
[align=left][TAG 。。。] 128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头[/align]
[align=left]注:[]号内的,表示,可选,即如果有的话。[/align]
[align=center]表8 MP3文件的内容组织结构[/align]
7 后记

最后想说的是,其实很无语,对于很多 东西,尤其是计算机相关的技术,网上能找到的中文资料,多数都是说的不是太清楚。其中,包括我这里要找的,如何去计算VBR的播放时间,多数情况是,不论是去百度Google一下,还是去Google百度一下,找了半天,还是没看到有几个人能说清楚。让人越发感叹道,国内的计算机方面的技术,和国 外,差的的确不是一点两点。人家把规范都定好了,过了N年了,结果咱们到现在,也没几个搞清楚咋回
事。。。

提醒,现已修正关于mpeg header的大小,不是固定的4字节,而是通常为4字节,当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节。

另外,有人提问,关于VBR总时长计算公式中的采样率,如果是变化的话,那么如果得到公式中的那个值的问题,目前我也不能理 解,有待以后解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: