Chinaunix首页 | 论坛 | 博客
  • 博客访问: 314135
  • 博文数量: 36
  • 博客积分: 2546
  • 博客等级: 少校
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-15 10:28
文章分类

全部博文(36)

文章存档

2012年(1)

2011年(2)

2009年(4)

2008年(29)

我的朋友

分类:

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首,NMASCII码表示的数字

 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)帧侧信息的结构
  见下表,引用自mpeg—layerIII文档
     
syntax No. of bits
audio_data() 

 main_data_begin 9
 if (mode==single_channel) private_bits
 else private_bits 5
3
 for (ch=0; ch   for (scfsi_band=0; scfsi_band<4; scfsi_band++) 
   scfsi[ch][scfsi_band] 1
 for (gr=0; gr<2; gr++) 
  for (ch=0; ch    part2_3_length[gr][ch] 12
   big_values[gr][ch] 9
   global_gain[gr][ch] 8
   scalefac_compress[gr][ch] 4
   window_switching_flag[gr][ch] 1
   if (window_switching_flag[gr][ch]) { 
    block_type[gr][ch] 2
    mixed_block_flag[gr][ch] 1
    for (region=0; region<2; region++) 
     table_select[gr][ch][region] 5
    for (window=0; window<3; window++) 
     subblock_gain[gr][ch][window] 3
    } 
   else { 
    for (region=0; region<3; region++) 
     table_select[gr][ch][region] 5
    region0_count[gr][ch] 4
    region1_count[gr][ch] 3
    } 
   preflag[gr][ch] 1
   scalefac_scale[gr][ch] 1
   count1table_select[gr][ch] 1
   } 
 main_data 
阅读(1537) | 评论(0) | 转发(0) |
0

上一篇:mp3 文件结构

下一篇:RTSP协议分析-1

给主人留下些什么吧!~~