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头的布局 |
- int tagSize = (header[9] & 0xff) + ((header[8] & 0xff) << 7)
- + ((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"。