MP3文件格式解析
Peter Lee 2008-06-05叫你一声老婆
目录
一、概述
二、整个MP3文件结构
三、MP3帧格式
 you belong with me1. 帧头格式
杨子陶虹2. MAIN_DATA
四、ID3标准
1. ID3V1
2. ID3V2
五、MP3文件实例剖析
六、资料
一、概述
MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3 的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group)在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即
Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB
的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉
噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压
缩后的文件在回放时能够达到比较接近原音源的声音效果。
二、整个MP3文件结构
MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)
ID3V2
包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。
Frame
.
.
.
Frame
一系列的帧,个数由文件大小和帧长决定
每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定
每个FRAME又分为帧头和数据实体两部分
帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立
ID3V1
包含了作者,作曲,专辑等信息,长度为128BYTE。
三、MP3帧格式
1. 帧头格式
帧头长4字节,对于固定位率的MP3文件,所有帧的帧头格式一样其数据结构如下:
typedef FrameHeader {
unsigned int sync: 11;                        //同步信息
unsigned int version: 2;                      //版本
天涯赤子心歌曲unsigned int layer: 2;                                    //层
unsigned int error protection: 1;                  // CRC校验
unsigned int bitrate_index: 4;            //位率
unsigned int sampling_frequency: 2;        //采样频率
unsigned int padding: 1;                    //帧长调节刘晓洁
unsigned int private: 1;                        //保留字
unsigned int mode: 2;                          //声道模式
unsigned int mode extension: 2;        //扩充模式
unsigned int copyright: 1;                            // 版权
unsigned int original: 1;                      //原版标志
unsigned int emphasis: 2;                  //强调模式
}HEADER, *LPHEADER;
帧头4字节使用说明见表1。
MP3帧长取决于位率和频率,计算公式为:
. mpeg1.0      layer1 :  帧长= (48000*bitrate)/sampling_freq + padding
layer2&3: 帧长= (144000*bitrate)/sampling_freq + padding
. mpeg2.0      layer1 :  帧长= (24000*bitrate)/sampling_freq + padding
layer2&3 : 帧长= (72000*bitrate)/sampling_freq + padding
例如:位率为64kbps,采样频率为44.1kHz,padding(帧长调节)为1时,帧长为210字节。
帧头后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。
表1 MP3帧头字节使用说明
名称位长说明
同步信息11所有位均为1,第1字节恒为FF。
版本200-MPEG 2.5  01-未定义10-MPEG 2    11-MPEG 1
层200-未定义01-Layer 3    10-Layer 2      11-Layer 1
CRC校
验1
1、2
节0-校验1-不校验
位率4取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。
bits V1,L1V1,L2V1,L3V2,L1V2,L2V2,L3
0000free free free free free free
000132323232(32)32(8)8 (8)
001064484064(48)48(16)16 (16)
001196564896(56)56(24)24 (24)
01001286456128(64)64(32)32 (32)
01011608064160(80)80(40)64 (40)
01101929680192(96)96(48)80 (48)
011122411296224(112)112(56)56 (56)
1000256128112256(128)128(64)64 (64)
1001288160128288(144)160(80)128 (80)
1010320192160320(160)192(96)160 (96)
1011352224192352(176)224(112)
112
(112) 1100384256224384(192)256(128)
128
(128) 1101416320256416(224)320(144)
256
(144) 1110448384320448(256)384(160)
320
(160) 1111bad bad bad bad bad bad
V1 - MPEG 1    V2 - MPEG 2 and MPEG 2.5
L1 - Layer 1    L2 - Layer 2    L3 - Layer 3
当年情
"free" 表示位率可变"bad" 表示不允许值
采样频率2
第3
采样频率,对于MPEG-1:  00-44.1kHz    01-48kHz    10-32kHz      11-未定义对于MPEG-2:  00-22.05kHz  01-24kHz    10-16kHz      11-未定义
对于MPEG-2.5:00-11.025kHz 01-12kHz    10-8kHz      11-未定义
帧长调节1用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。
保留字1没有使用。
声道模式2表示声道, 00-立体声Stereo    01-Joint Stereo    10-双声道11-单声道
扩充模式2当声道模式为01是才使用。
Value强度立体声MS立体声
00off off
01on off
10off on
11on on
版权1文件是否合法,0-不合法1-合法原版标志1是否原版,0-非原版1-原版
强调方式2
第4
用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。
00-未定义01-50/15ms    10-保留11-CCITT J.17
2. MAIN_DATA
MAIN_DATA 部分长度是否变化决定于FRAMEHEADER 的bitrate 是否变化,一首MP3 歌曲,它有三个版
本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps。Kbps(比特位速率),表明了音乐每秒的数据量,
Kbps 值越高,音质越好,文件也越大,MP3 标准规定,不变的bitrate 的MP3 文件称作CBR,大多数MP3
文件都是CBR 的,而变化的bitrate 的MP3 文件称作VBR,每个FRAME 的长度都可能是变化的。下面是CBR
和VBR 的不同点:
1)CBR:固定位率的FRAME 的大小是固定的(公式如上所述),只要知道文件总长度,和帧长即可由播
放每帧需26ms 计算得出mp3 播放的总时间,也可通过计数帧的个数控制快进、快退慢放等操作。注:有些时候,并不是所有的帧都是等长的,有的帧可能多一个或几个字节。
2)VBR:VBR 是XING 公司推出的算法,所以在MP3 的FRAME 里会有“XING"这个关键字(现在很多流行的
小软件也可以进行VBR 压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个有效FRAME 里,它标识了这个MP3 文件是VBR 的。同时第一个FRAME 里存放了MP3 文件的FRAME 的总个数,这就很容易获得了播放总时间,同时还有100 个字节存放了播放总时间的100 个时间分段的FRAME 的INDEX,假设4 分钟的MP3 歌曲,240S,分成1 00 段,每两个相邻INDEX 的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速出我们需要快进的FRAME 头。