ID3v2 中文文档ver2.3.0
1. ID3标签信息(版本2.3.0)
1.1 文档说明
1.2 摘要
2. 约定
3. ID3v2概述
3.1 ID3v2 标签头(header)
3.2 ID3v2 扩展标签头(extended header)
3.3 ID3v2 帧(frame)
3.3.1 帧头标识(frame header flags)
3.3.2 默认帧头标识(default flags)
4. ID3v2帧定义
4.1 文件唯一标识
4.2 文本信息帧
4.2.1 文本信息帧详细说明
4.2.2 用户自定义文本信息帧
4.3 超链接帧
4.3.1 超链接帧详细说明
4.3.2 用户自定义超链接帧
4.4 参与者列表
4.5 音乐CD标识
4.6 时间事件编码
4.7 MPEG位置查表
4.8 拍子同步编码
4.9 非同步歌词
4.10 同步歌词
4.11 备注
4.12 音量调节
4.13 均衡器
4.14 混音器
4.15 附加图片
4.16 通用压缩对象
4.17 播放计数器
4.18 欢迎程度
4.19 推荐缓存大小
4.20 音频文件加密
4.21 连接信息
4.22 位置同步帧
4.23 使用条款
4.24 所有权
4.25 广告
4.26 加密方式注册
4.27 分组信息注册
4.28 个人信息
5. 非同步编码
6. 版权信息
7. 参考文档
8. 附录
8.1 附录A- 音乐类型列表(ID3v1)
9.
1. ID3标签信息
1.1 文档说明
本文档是取代ID3v2.2.0标准的一个非正式版本。推出这个非正式版是为了让广大编程者可以在正式标准发布之前对本文中的一系列的标准有所认识。如果正式版与本文内容不一致,那正式版会用另外的版本号。本文的内容可能为会精简,但绝不会增加或改变标准定义。
1.2 摘要
本文描述了基于2.2.0版开发的2.3.0版的ID3v2非正式标准。ID3v2将音频文件的信息灵活地存入音频文件本身,这些信息包括一些专业技术信息,如均衡器设置,也包括一些标签信息,如标题,演唱者,版权等。
2. 约定
在本文例子中,在双引号("")内的文本表示一个文本字符串。以$开头的数字是十六进制的,以%开头的是二进制。$xx用来表示一个数值不定的字节(byte)。%x用来表示一位数值不定的比特(bit)。一个字节的最高有效位(MSB)是第7位,最低有效位(LSB)是第0位。
标签(tag)表示整个ID3标签信息。帧(frame)表示标签(tag)内的一段信息。标签(tag)是由标准头(header),帧(frame)和可选的补白数据(padding)组成的。域(field)指的是一段信息内的一小段数据,一个数值,或者一个字符串等。数字字符串表示一串只由0-9组成的字符串。
3. ID3v2概述
在设计ID3v2时有两大要点:一是要在不影响已有软件的基础上实现ID3v2,二是ID3v2的实现即要灵活,又要可扩展。
要点一:MPEG解码软件是通过检测内嵌在音频文件里面的同步信号(syncsignal)来播放音频文件的。所以ID3v2的标签不可以含有同步信号,这样软件才不会将ID3v2的信息当成音频来播放。如果真的在ID3v2的信息里面出现同步信号的话,请参照第五章《非同步编码》。
要点二:ID3v2是由一系列的信息块,所谓的帧(frame),构成的,而软件不需要知道这些信息块的格式。在每一个帧的开头,都有一个标记来标识这一帧(frame)的格式,内容和大小。软件可以根据帧的大小直接跳过而不用去处理它。
如果你需要得到ID3v2的完整版本号,在ID3v2的标签头(header)内就有版本号和整个ID3v2标签信息大小的数据。
本文件所描述的ID3标签主要是针对用MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III 和 MPEG-2.5编码的文件,当然其它类型编码的音频可能也会适用。
ID3v2的位顺序是最高有效位(MSB)先。字节顺序是最高有效字节先。(例如,如果要写
入$12345678, 则要写$12 34 45 78)
ID3v2规范允许你在所有帧数据的后面填充一些补白数据(padding)。你可以将ID3v2的大小定义得比你所有帧(frame)数据的总和要大,这样剩余的数据就要填充补白数据(padding)。这样做的好处是你可以预留一些空间放额外的帧(frame),否则当你想增加额外的帧(frame)时就要重新写过整个文件。补白数据用$00。
Blocks | Fields | Bytes | Content |
Header | ID3v2 Identifier | 3 | "ID3" |
ID3v2 Version | 2 | $03 00 | |
ID3v2 Flags | 1 | %abc00000 | |
ID3v2 Size | 4 | %0xxxxxxx | |
Extended Header | Extended Header Size | 4 | $xx xx xx xx |
Extended Flags | 2 | $xx xx | |
Size of padding | 4 | $xx xx xx xx | |
Frame | Frame ID | 4 | "AENC"/"APIC"/"COMM"/... |
Frame Size | 4 | $xx xx xx xx | |
Flags | 2 | %abc00000 %ijk00000 | |
DATA | Frame Size | $xx ... | |
... | ... | ... | ... |
Frame | Frame ID | 4 | "AENC"/"APIC"/"COMM"/... |
Frame Size | 4 | $xx xx xx xx | |
Flags | 2 | %abc00000 %ijk00000 | |
DATA | Frame Size | $xx ... | |
Padding | $00 ... | ||
ID3标签信息结构图
3.1 ID3v2标签头(header)
ID3v2的标签头(header)应该是音频文件最开头的10个字节数据,如下表
ID3v2/file identifier | "ID3" |
ID3v2 version | $03 00 |
ID3v2 flags | %abc00000 |
ID3v2 size | 4 * %0xxxxxxx |
ID3v2的标签头(header)总是以三个字节的"ID3"字符串开头,以此来标识这是ID3v2信息。紧跟着的两个字节表示ID3v2的版本号,版本号的第一个字节表示主版本号,第二个字节表示修订号。本文是ID3v2.3.0版。所有的修订号都是向后兼容的,但主版本号不是。如果软件只支持ID3v2.2.0或最低的版本,那么它应该直接跳过ID3v2.3.0或最高版本的标签信息。主版本号和修订号绝不会是$FF。
版本号后是一个字节的标签头标识文档字符串是什么(flags),其中只有三位是有意义的:
a - 非同步编码(Unsynchronisation)
标签头标识(flags)的第7位用来表示当前ID3v2信息是否经过非同步编码。当这位为1时,表示ID3v2信息经过非同步编码。
b - 扩展标签头(Extended header)
标签头标识(flags)的第6位用来表示标签头数据后面是否有扩展标签头数据。扩展标签头请参照第三章第二节。
c - 测试指示位(Experimemtal indicator)
标签头标识(flags)的第5位用来表示当前是否为测试版。如果有测试阶段,请将此位置1。
标签头标识(flags)的其它位统统要设为0。如果其中一位为1,那么程序可能不能正确识别该标签。
ID3v2的标签信息大小是用4个字节记录。但这四个字节的最高位都设为0。所以总共有28
位来表示大小。所以如果ID3v2标签信息的长度为257个字节,那么大小就是
$00 00 02 01。
这里说的大小是ID3v2信息经过非同步编码,包括扩展标签头(extended header),补白数据(padding),但不包括标签头的大小,也就是整个ID3v2标签信息大小减去10。只用28位(256MB)是为了避免与MP3的同步信号冲突。
可以通过以下序列来检测ID3v2的标签信息的开始:
$49 44 33 yy yy xx zz zz zz zz
yy小于$FF, xx是标签头标识字节,zz小于$80。
3.2 ID3v2扩展标签头(extended header)
扩展标签头(extended header)包含了一些对正确解析ID3v2标签信息影响不大的信息,可以它是可选的。
扩展标签头大小(Extended header size) | $xx xx xx xx |
扩展标识(Extended Flags) | $xx xx |
补白大小(Size of padding) | $xx xx xx xx |
扩展标签头大小,现在可以是6或10个字节,不包括它自己。补白大小就是整个ID3v2标签信息的大小减去标签头(header)和帧(frame)的大小,换言之就是补白的大小。扩展标签头与标签头是分离的,所以它也是要经过非同步编码的。
扩展标识是为了描述以后的标签属性,它的定义如下:
%x0000000 00000000
x - CRC验证
如果x位置1,那扩展标签头后就会有4个字节的CRC-32数据。CRC是根据扩展标签头与补白数据之间的数据计算出来的,也就是根据所有的帧计算出来的。
3.3 ID3v2帧
正如ID3v2标签信息是由标签头和一帧或多个帧组成的,所有的帧是由帧头,加上一段或多段帧信息组成的。帧头(frame header)的结构如下:
帧ID (frame ID) | $xx xx xx xx (4个字符) |
帧大小(Size) | $xx xx xx xx |
帧标识(Flags) | $xx xx |
帧ID是由大写英文字母A到Z,数字0到9组成的长度为4个字节的字符串。以"X","Y","Z"开头的表示是测试用途,所以所有人都可以自由使用,而无需将标签头标识中的测试指示位置1。但请记住别人可能与你使用相同的帧ID。而其它的帧ID则已被使用,或者保留作日后使用。
帧ID后是帧的大小,帧大小用4个字节使帧头的大小刚好是10个字节。而帧大小是用帧的总大小减去帧头大小计算出来的(帧的总大小-10)。
帧大小后是两个字节的帧标识。关于帧标识,请参照第三章第三节第一小节。
虽然我们希望帧是按对文件识别的重要性来排序,例如UFID,TIT2,MCDI,TRCK,但实际上帧在标签信息中的位置是不需要固定的。
ID3v2标签信息应该包含至少一个帧。而帧的大小,除去帧头外至少要有一个字节。
如果没有特别说明,字符串是使用ISO-8859-1字符集,范围从$20-$FF。在本文中,<text
string>表示使用ISO-8859-1字符集的字符串,如果字符串中有换行符,则用<full text string>表示。所有的Unicode字符是用16位的Unicode 2.0(ISO/IEC 10646-1:1993,UCS-2)。Unicode字符串必须用Unicode BOM($FF FE 或者 $FE FF)标识其字节顺序。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论