ID3v2的结构

7.4.3  ID3V2标签

1998年,ID3V2作为新的标准诞生了,尽管其沿用了"ID3"的名称,但是ID3V2和ID3V1并没有太多联系。ID3V2定义在MP3文件的头部,这与ID3V1不同。ID3V2是变长的,这一特性使ID3V2具有良好的扩展性,甚至个人也可以定义ID3V2中的帧,只要符合ID3V2的布局即可。

ID3V2的结构图如图7-8所示,其中深色标识的结构是可选的。在ID3V2中,比特顺序采用Big endian方式排列,也就是高字节存储在高位。ID3V2的结构相对于ID3V1复杂很多,这里重点介绍ID3V2头和ID3V2帧。

 
图7-8  ID3V2的结构图

1. ID3V2头

ID3V2头(Header)的长度是固定的,共10个字节,其布局如图7-9所示。

 
图7-9  ID3V2头的布局
前3个字节总是"ID3",可以通过检查这个文件标识来判断是否是ID3V2头。随后2个字节是ID3V2的版本,其中第4个字节代表ID3V2的主版本号,第5个字节代表ID3V2的修订版本号。目前ID3V2的2.3和2.4版本应用最广泛。随后的一个字节是标志位,目前此字节的前4位在使用,其他位为0,标志位的第2比特标识了ID3V2头后面是否有扩展头,标志位的第4位标志了ID3V2最后是否含有Footer。最后的4个字节标识了ID3V2的大小,其中包括10个字节的ID3V2头。由于每个字节的第1位永远是0,因此只有28个字节用来表示大小。计算大小时可以采用下面的代码:
 
 
  1. int tagSize = (header[9] & 0xff) + ((header[8] & 0xff) << 7)  
  2.                 + ((header[7] & 0xff) << 14) + ((header[6] & 0xff) << 21); 

2. 扩展头

扩展头(Extended Header)包含了更多的数据信息,这些数据是对ID3V2头的补充,但是并非解析MP3文件的关键数据。

3. ID3V2 帧

每个ID3V2标签含有一个或者多个ID3V2帧,每个帧由ID3V2帧头和帧体构成。ID3V2帧头由4个字节的帧ID、4个字节的大小标志和2个字节的标志位组成,共计10个字节。帧头的布局如图7-10所示。其中帧ID由4个字符组成,字符可以是0~9和A~Z,例如TIT2、TALB等。紧随其后是4个字节的尺寸标识,4个字节的每个比特都可以使用,共计32位用来表示帧的大小。需要注意的是,这个大小表示的是帧体的大小,不包括帧头的10个字节,因此整个尺寸应该是帧体的大小加上10个字节。标签帧并没有固定的顺序要求,TIT2可以出现在TALB前面,也可以出现在TALB的后面。

 
图7-10  ID3V2帧头的布局

ID3V2的帧体由字节数组构成,其内容一般是与帧ID对应的。例如,TIT2帧体内存储了歌曲的标题,TALB帧体内存储了歌曲的专辑信息。帧体的第1个字节标识了字符的编码方式,目前有4种编码方式可用。

0000 0000代表字符使用ISO-8859-1编码方式;

0000 0001代表字符使用UTF-16编码方式;

0000 0002代表字符使用 UTF-16BE编码方式;

0000 0003代表字符使用UTF-8编码方式。

在读取帧体内容时,应该按照上面的编码对应表首先确定编码方式,然后再生成相关的字符串。对于TIT2和TALB等帧ID来说,读取其内容比较简单。对于USLT(对应歌曲的歌词信息)等结构较复杂的帧,需要仔细研究其格式才能将内容从帧体中读取出来。

4. 填充

在ID3V2帧后面可以存放填充(Padding)位,填充位的值只能是0。填充位使得ID3V2帧的大小比ID3V2计算得到的大小要小一些,也就是说,留下了一些空白的空间,这些空间可以用来增加一些额外的帧信息。由于增加的信息写在一些空白的空间内,因此无须重写整个文件,这也就是填充存在的重要意义。

5. ID3V2尾

ID3V2 尾(Footer)是可选的,有时候可能需要从MP3文件的尾部向前搜索ID3V2的位置,这时候ID3V2的存在就可以大大地加快搜索的速度。ID3V2 尾和ID3V2 头的内容是一致的,只是文件标识部分由"ID3"改成了"3DI"。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值