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


    主题:MPEG简介 + 如何计算 CBR/VBR MP3 的播放时间 
    版本:20090919 
    作者:crifan 
    邮箱:green-waste(At)163.com 
    声明: 
    1.本文所写内容,多数整理自自互联网,版权归原作者所有。 
    2.笔者知识有限,文中难免有误,欢迎批评指正。 
    3.欢迎盗版,盗版不究。 
    --------------------------------------无敌分割线------------------------------------------- 
    【此文目的】 
    1.  了解 MPEG相关知识 
    2.  了解 MP3 的常见术语含义 
    3.  详解 VBR MP3的帧头格式及含义 
    4.  搞懂如何去计算 CBR和 VBR的 MP3文件的播放时间(duration) 
     
    【目录】 
    1.MPEG 的相关知识.............................................................................2 
    1.1 MPEG 是啥......................................................................................................3
    1.2 为啥没了 MPEG-3 ...........................................................................................3
    1.3 MPEG2.5 又是啥.............................................................................................3
    1.4 MPEG 中不同帧之间的关系..........................................................................3
    1.5 MPEG-1和 MPEG-2音频特性.......................................................................4
    1.5.1 MPEG-1 音频(ISO/IEC 11172-3)...................................................................4 
    1.5.2 MPEG-2 音频(ISO/IEC 13813-3)..................................................................4 
    1.6  什么是 ISO/IEC 11172-3 和 ISO/IEC 13818-3..............................................4 
    2 MP3 中常见的术语................................................................................5
    2.1  啥叫 MP3.........................................................................................................5
    2.2  什么是 LSF......................................................................................................5
    2.3  什么是帧(frame)........................................................................................5
    2.4  什么是帧头(header)...................................................................................5
    2.5  啥是 CBR和 VBR ..........................................................................................5
    2.6  比特率(bitrate)...........................................................................................6
    2.7  边信息(side information)...........................................................................6
    3 VBR MP3 的帧头格式详解..................................................................6
    3.1 VBR MP3的帧头类型.....................................................................................6
    3.2 MPEG 音频帧格式及其含义介绍..................................................................6
    4 MP3 的播放时间的计算公式及 XING 和 VBRI 头介绍....................94.1 CBR的 MP3 的播放时间(duration)计算公式................................................9 
    4.2 VBR的 MP3 的播放时间(duration)计算公式................................................9
    4.2.1 Xing TAG / Xing 头(header)...........................................................................9 
    4.2.2 VBRI头(header)............................................................................................10 
    5 计算 CBR 和 VBR 的 MP3 文件的播放时间的步骤......................11 
    5.1  定位到 MPEG的帧头的位置......................................................................11
    5.2  解析 MPEG帧头,获取必要信息..............................................................11
    5.3  判断是 VBR还是 CBR,根据公式计算播放时间....................................11
    5.3.1 定位出 Xing 头....................................................................................................12 
    5.3.2 如果有,解析 Xing 头,并计算播放时间........................................................12 
    5.3.3 如果没 XING 头,定位出 VBRI 头位置,找 VBRI 头....................................12 
    5.3.4 如果都没找到,说明是 CBR,则计算 CBR的播放时间..............................12 
    6 MP3 的文件的内容组织结构..............................................................13 
    7 后记......................................................................................................14
    8 文章引用..............................................................................................15
     
    【表格索引】 
    表 1  MPEG音频帧头的格式................................................................................................7 
    表 2   比特率............................................................................................................................8 
    表 3   每帧的采样数................................................................................................................8 
    表 4  MPEG不同版本对应的采样率....................................................................................8 
    表 5  XING  头......................................................................................................................10 
    表 6  VBRI头.......................................................................................................................11 
    表 7  Layer III 的边信息(side information)....................................................................12 
    表 8  MP3文件的内容组织结构.........................................................................................14 
     
    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 
    估计有人纳闷了,为啥中间的 MPEG3 咋没了呢? 
    是没 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) 
    其描述了三层音频编码,具有如下特性: 
    A. 一个或两个音频声道 
    B.采样率 32KHz、44.1KHz 或 48KHz 
    C. 比特率从 32Kbps 到 448Kbps 
    D. 每一层都有其自己的其他特点。 
    1.5.2 MPEG-2音频(ISO/IEC 13813-3) 
    其包含了对 MPEG-1 的两种扩展。通常称为 MEGP-2/低采样率(LSF)和 MPEG-2/多声道
    (Multichannel)。 
    1.5.2.1 MPEG-2/LSF 的特性: 
    A. 一个或两个音频声道 
    B.采样率只有 MPEG-1 的一半 
    C. 比特率从 8Kpbs 到 256Kbps 
    1.5.2.2 MPEG-2/多声道,的特性: 
    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之手。 
    因此,ISO/IEC 11172 和 ISO/IEC 13818,其实就是 MPEG1 的音频部分和 MPEG-2的别
    名。 
    另外,由于 MPEG-1 和MPEG-2,每个都分好几个部分,其中,第三部分是关于音频的。
    所以,ISO/IEC 11172-3 和 ISO/IEC 13818-3,就分别对应着 MPEG-1 的音频,MPEG-2
    的音频,也就是我们常常提到的 MPEG 的音频文件所对应的规范。 2 MP3 中常见的术语 
    知道了 MPEG 的来龙去脉后,在了解 MP3 的播放时间如何计算之前,也要知道其他一些,
    和 MP3相关的知识,和常见的术语: 
    2.1 啥叫 MP3 
    注意,这个 MP3,不是 MPEG-3,但是为何叫 MP3,是因为: 
    MPEG 规范中规定了,每一个版本的 MPEG,比如 MPEG1,MPEG2等,都有三种不同的
    Layer,不同 Layer 的序号命令是以罗马数字的,所以叫做 Layer I, Layer II, Layer III。 
    其中,最常见的就是 MPEG 1 的 Layer III,就是众所周知的 MP3。 
    根据事物发展由简到繁的规律,我们知道,Layer III,相对 Layer I 和 Layer II,其有着更复
    杂的压缩算法。正是其相对复杂,用了很多算法,比如声学上的掩蔽效应(masking effect),
    Huffman 压缩等,使得尽可能保持音质的基础上,极大地减少了音频文件大小,也就是说,
    尽量让你听上去音频声音和音质都没啥变化,但是 MP3的文件大小,相对于原先没处理的,
    或者其他格式的,比如 WAV 格式等,要小很多,方便大家互相传播交流。这也是 MP3 如
    此流行的主要原因之一。 
    2.2 什么是 LSF 
    MPEG2/2.5 也常被简称为 LSF(Low Sampling Frequencies),低采样率。 
    2.3 什么是帧(frame) 
    通俗点说,就是一段连续的数据块。对于 MPEG 音频文件本身,并没有什么文件头,而是
    由很多数据块所组成,这样的单个的数据块,就叫做一个(数据/音频)帧(frame)。MP3
    文件,同理,由很多个帧所组成。帧,也是其他很多音视频技术中的基本单位。 
    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的帧头类型 
    VBR MP3的帧头主要有两种,XING 和 VBRI。 
    关于它们的具体格式和含义,下面会详细解释。 
    另外常常会提到的是,关于 V1和 V2 两个版本的 ID3 头信息,这个主要是用于记录音频文
    件的一些描述信息,比如歌手,专辑,曲风等,和对音频文件解码,没有直接关系。属于存
    储音频文件附属信息的头。 
    ID3的 V1和V2,不会同时存在。如果存在 ID3的话,一般 ID3 V1会放在音频文件的最后,
    大小 128个字节,其中前三个字节是字符“TAG”。ID3 V2 放在音频文件的开头处,前三个
    字节是字符“ID3”。 
    关于 ID3的具体格式,请参考附录中的引用文献。 
    由于此处介绍的内容,目的是尽快,尽可能精确地去估算 MP3 文件的(持续)播放时间。
    所以,此处不涉及,关于如何去编解码实际的音频数据。 
    3.2 MPEG 音频帧格式及其含义介绍 
    MPEG 音频文件,由一个个的帧(Frame)组成。每一帧都有个帧头(Frame Header),
    位于该帧的最开始处,接下来的是音频数据。音频数据多数都是包含了 固定数目 的 音频
    采样(Sample)。正是基于这个特性,才有后面的 VBR的播放时间计算公式。 
    前面介绍过了,目前,存在的三种 Layer 的 MPEG 音频,尽管他们的压缩方法各不相同,
    但是帧头格式都一样。 
    这些帧,由一个个的 Slot(槽)组成。 
    Layer I 中,一个 Slot 是4 个字节,在 Layer II和 Layer III中,一个 Slot 是一个字节。 MPEG 帧头的格式及含义 
    位置  长度  含义  示例  
    0  11  用于同步帧,找到此帧头(所有位均置 1) 
    1111 1111 
    111 
    11  2 
    音频版本 ID (参见 表 3.2)  
    00 - 版本是 MPEG 2.5 (MPED-2 的非官方扩展版本) 
    01 – 保留 
    10 – 版本是 MPEG 2 (ISO/IEC 13818-3) 
    11 – 版本是 MPEG 1 (ISO/IEC 11172-3)  
    11 
    13  2 
    Layer 的索引  
    00 – 保留 
    01 - Layer III 
    10 - Layer II 
    11 - Layer I 
    01 
    15  1 
    保护位  
    0 – 用 16位的 CRC保护下面的帧头  
    1 – 无 CRC 
    16  4  比特率索引 (参见 表 2.1.3)  1001 
    20  2  采样率索引 (参见表 2.1.2)  11 
    22  1 
    填充位  
    如果设置了,就会对每帧数据填充一个 slot (对于帧大
    小的计算很重要) 
    23  1  私有位 (仅用于标示性的)  1 
    24  2 
    声道的模式  
    00 – 立体声 
    01 – 混合立体声 
    10 – 双声道 (两个单声道) 
    11 – 一个声道 (单声道) 
    注: 双声道文件由两个独立的单声道所组成。大多数解
    码器把双声道输出成立体声,但是实际上,不是所有的
    双声道都是立体声的。 
    01 
    26  2  模式扩展 (仅用于联合立体声) (参见 表 2.1.6)  00 
    表 1  MPEG音频帧头的格式 
    在 MPEG 标准中,描述了一种自由格式(free format),这种自由格式意思为用一个固定
    比特率对文件进行编码,而此固定的比特率不是我们表中预定义好的。一般的解码器都无法
    解码这类音频文件。 下面是比特率索引表,(单位:Kbit/sec)。 
    MPEG 1  MPEG 2, 2.5 (LSF)  比特率 
    索引  Layer I  Layer II  Layer III  Layer I  Layer II & III 
    0000  空闲 
    0001  32  32  32  32  8 
    0010  64  48  40  48  16 
    0011  96  56  48  56  24 
    0100  128  64  56  64  32 
    0101  160  80  64  80  40 
    0110  192  96  80  96  48 
    0111  224  112  96  112  56 
    1000  256  128  112  128  64 
    1001  288  160  128  144  80 
    1010  320  192  160  160  96 
    1011  352  224  192  176  112 
    1100  384  256  224  192  128 
    1101  416  320  256  224  144 
    1110  448  384  320  256  160 
    1111  保留 
    表 2  比特率 
    为了计算帧大小,我们需要知道,每一帧里面包含多少个采样,即采样数/帧(sample per 
    frame)。 
      MPEG 1  MPEG 2 (LSF)  MPEG 2.5 (LSF) 
    Layer I  384  384  384 
    Layer II  1152  1152  1152 
    Layer III  1152  576  576 
    表 3  每帧的采样数 
    根据 MPEG帧头里面的索引,对应的,不同版本的 MPEG的采样率也是不同的: 
    采样率索引  MPEG 1  MPEG 2 (LSF)  MPEG 2.5 (LSF) 
    00  44100 Hz  22050 Hz  11025 Hz 
    01  48000 Hz  24000 Hz  12000 Hz 
    10  32000 Hz  16000 Hz  8000 Hz 
    11  保留 
    表 4  MPEG不同版本对应的采样率 4 MP3 的播放时间的计算公式及 XING 和
    VBRI头介绍 
    4.1 CBR 的 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,要用另外的公式。下面将会详细介绍。 
    4.2 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              + 边信息大小          【公式 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头 
    5 计算CBR和VBR的MP3文件的播放时
    间的步骤 
    此处只是大概总结一下,具体解析出播放时间,需要哪些步骤。其对应的代码,可以去文章
    引用中的【1】,注册登录后,可以下载源代码,自己看,就知道了。 
    或者,可以去参考引用【2】中的 Mplayer 的 VBR 的 patch,里面写的更加简单,但是也
    更容易看明白。 
    5.1 定位到 MPEG 的帧头的位置 
    如果文件开始没有 ID3 V2的头信息,那么一般 MPEG 的帧头位置是 0,当然,具体还是要
    根据帧头中的同步位(sync bit),共 11位去定位找到帧头。 
    5.2 解析 MPEG 帧头,获取必要信息 
    主要是根据帧头格式,解析出 MPEG 的版本,MPEG 的 Layer,以及采样率,比特率等信
    息,用于后面的解码和计算播放时长。 
    5.3 判断是 VBR 还是 CBR,根据公式计算播放时间 
    解析完 MPEG 头之后,按照如下步骤去判断是 CBR还是 VBR,并计算出播放时长: 5.3.1 定位出 Xing头 
    根据: 
    XING 头位置 =  MPEG头位置 +  4  + 边信息大小                     【公式 4】 
    计算定位到 XING 头所在位置。上式中: 
    MPEG 头位置: 
    如果没有 ID3 V2 这类的信息的话,那么 MPEG 头位置就是文件的最开始,即 0的位置。 
    MPEG 帧头大小: 
    固定的 32 bit = 4字节,所以加 4. 
    边信息大小: 
    对应 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比特大小的比特率索引 ,然后根据表 3.2.2 比特率(单位:
    Kbit/sec),得到此比特率大小。 
    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】 
    计算出播放时间了。 
    6 MP3 的文件的内容组织结构 
    所以,总结起来,一般的 MP3 文件所包含的内容如下:  
    [ID3。。。] ID3 V2的头,大多数最新的 MP3,都有这个头 
    [APE 头] 用于 APE 格式的头,现在也用于 MPEG 
    第一帧包含: 
    1.MPEG 音频头, 固定的 4 字节 
    2.边信息,9/17/32 字节 
    [3.Xing 头] 8-120 字节,如果是 VBR,多数都有此 Xing 头,而且只有第一帧有 
    。。。。。音频数据。。。。 
    第二帧(帧头,边信息,数据。。。) 
    第三帧(帧头,边信息,数据。。。)
    。。。 
    最后一帧(帧头,边信息,数据。。。) 
    [TAG 。。。] 128字节的 ID3 V1信息,如果没有前面的 ID3 V2,多数都有这个 ID3 V1的头 
    注:[]号内的,表示,可选,即如果有的话。 
    表 8  MP3 文件的内容组织结构 
    7 后记 
    最后想说的是,其实很无语,对于很多东西,尤其是计算机相关的技术,网上能找到的中文资料,多数都是说的不是太清楚。其中,包括我这里要找的,如何去计算 VBR的播放时间,
    多数情况是,不论是去百度 Google 一下,还是去 Google 百度一下,找了半天,还是没看
    到有几个人能说清楚。让人越发感叹道,国内的计算机方面的技术,和国外,差的的确不是
    一点两点。人家把规范都定好了,过了 N年了,结果咱们到现在,也没几个搞清楚咋回事。。。 
    因此,对于计算机方面的资料,尤其是涉及底层技术的,能详细解释清楚你的问题的,多数
    都是一些英文原版资料。所以,在此,再次,感谢一下原作者。。。 
    8 文章引用 
    【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
    loop's blog
  • 相关阅读:
    Linux.Unix.windows的纠结史
    第一次来到博客园
    canvas的fillText参数解释
    【转】Javascript画立体玫瑰
    C#学习笔记(有C,C++,JAVA语言基础)
    推荐NHibernate新书:NHibernate 3.0 CookBook[附下载]
    NHibernate之旅系列文章导航
    存储过程
    .Net下的 ORM框架介紹
    十步让你成为更优秀的程序员
  • 原文地址:https://www.cnblogs.com/goodloop/p/1836975.html
Copyright © 2020-2023  润新知