分类:
2008-09-09 07:23:23
Mp3主要由以下三个部分组成:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)。
ID3V2:包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量;
Frame
… 是mp3的主体信息。其详细的结构见后面的文章。
Frame
ID3V1:包含了作者,作曲,专辑等信息,长度为128BYTE。
(1) ID3V2的数据结构及其对应的信息
ID3V2结构比ID3V1的结构要复杂得多,但比后者全面且可以伸缩和扩展。
每个ID3V2.3的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。
1、标签头
在文件的首部顺序记录10个字节的ID3V2.3的头部。数据结构如下:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
char Ver; /*版本号ID3V2.3就记录3*/
char Revision; /*副版本号此版本记录为0*/
char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/
char Size[4]; /*标签大小,包括标签头的10个字节和所有的标签帧的大小*/
1).标志字节
标志字节一般为0,定义如下:
abc00000
a -- 表示是否使用Unsynchronisation
b -- 表示是否有扩展头部
c -- 表示是否为测试标签
2).标签大小
一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小,计算公式如下:
int total_size;
total_size = (Size[0]&0x 7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80
+(Size[3]&0x7F)
2、标签帧
每个标签帧都有一个10个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
帧头的定义如下:
char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
char Flags[2]; /*存放标志,只定义了6位,稍后详细解说*/
1).帧标识
用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER=年代 是用ASCII码表示的数字
TCON=类型 直接用字符串表示
COMM=备注 格式:"eng\0备注内容",其中eng表示备注所使用的自然语言
2).大小
每个字节的8位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x100000000+Size[1]*0x10000+Size[2]*0x100+Size[3];
3).标志
只定义了6位,另外的10位为0,但大部分的情况下16位都为0就可以了。格式如下:
abc00000 ijk00000
a -- 标签保护标志,设置时认为此帧作废
b -- 文件保护标志,设置时认为此帧作废
c -- 只读标志,设置时认为此帧不能修改
i -- 压缩标志,设置时一个字节存放两个BCD码表示数字
j -- 加密标志
k -- 组标志,设置时说明此帧和其他的某帧是一组
(3) Frame的数据结构
在ID3V2和ID3V1中间的部分就是mp3的主体信息。他们由很多不同的帧所组成,我们称每一个帧为一个frame,如下所示:
帧头信息 检验信息(看Protection_bit是否为0) 帧侧信息 音频信息 辅助信息
每个frame包括32个bit的帧头信息,(可能有检验信息)帧侧信息,然后就是比例因子的数据和huffman编码后的数据。
(a) 帧头信息的结构:
32个bit的分配如下
名称
长度
位置
描述
syncword
12
20到31bit
帧同步信息,为0xfff
id
1
19bit
0为mpeg version 2
1为mpeg version 1
Layer
2
17,18bit
00 -- 保留
01 -- 层III
10 -- 层II
11 -- 层I
Protection_bit
1
16bit
0 --有crc校验码
1 –无crc校验码
Bitrate_index
4
12到15bit
sampling_frequency
2
10,11bit
Padding_bit
1
9bit
如果该位为1,那么帧中包含一个额外槽,用于把中等位率调节为采样频率,否则该位必须为0。在采样频率为44.1
kHz时,填补是必要的,在自由格式中也可能需要填补。
Private_bit
1
8bit
标志私有使用的位
Mode
2
6,7bit
00--立体声
01--联合立体声
10—双声道
11—单声道
mode_extension
'00' 4-31子带 在联合立体声中,
bound==4
'01' 8-31子带 在联合立体声中, bound==8
'10' 12-31子带 在联合立体声中, bound==12
'11' 16-31子带 在联合立体声中, bound==16
Mode_extension
2
4,5bit
Copyright
1
3bit
0--音频无版权要求
1—有版权保护
Copy
1
2bit
0—为复制版
1—为原版
emphasis emphasis specified
'00' none
'01' 50/15 microseconds
'10' reserved
'11' CCITT J.17
Emphasis
2
0,1bit
(b)帧侧信息的结构