
ID3v2 中文文档ver2.3.0.docx
10页ID3v2 中文文档 ver2.3.01. 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)时就要重新写过整个文件补白数据用$00Blocks Fields Bytes ContentID3v2 Identifier 3 "ID3"ID3v2 Version 2 $03 00ID3v2 Flags 1 %abc00000HeaderID3v2 Size 4 %0xxxxxxxExtended Header Size 4 $xx xx xx xxExtended Flags 2 $xx xxExtended HeaderSize of padding 4 $xx xx xx xxFrame ID 4 "AENC"/"APIC"/"COMM"/...Frame Size 4 $xx xx xx xxFlags 2 %abc00000 %ijk00000FrameDATA Frame Size $xx ...... ... ... ...Frame ID 4 "AENC"/"APIC"/"COMM"/...Frame Size 4 $xx xx xx xxFlags 2 %abc00000 %ijk00000FrameDATA Frame Size $xx ...Padding $00 ...ID3 标签信息结构图3.1 ID3v2 标签头(header)ID3v2 的标签头(header)应该是音频文件最开头的 10 个字节数据,如下表ID3v2/file identifier "ID3"ID3v2 version $03 00ID3v2 flags %abc00000ID3v2 size 4 * %0xxxxxxxID3v2 的标签头(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 zzyy 小于$FF, xx 是标签头标识字节,zz 小于$803.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 00000000x - 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在本文中,表示使用 ISO-8859-1 字符集的字符串,如果字符串中有换行符,则用表示所有的 Unicode 字符是用 16 位的 Unicode 2.0(ISO/IEC 10646-1:1993,UCS-2)Unicode 字符串必须用 Unicode BOM($FF FE 或者 $FE FF)标识其字节顺序全数字字符串和超链接总是用 ISO-8859-1 字符集编码用 ISO-8859-1 字符编码时,结束字符用$00,而 Unicode 用$00 00 表示如没特别说明,换行符是禁止使用的如果允许使用换行符,用ISO-8859-1 字符编码时,换行用$0A 表示。
如果帧数据允许使用不同的字符集编码,那么在帧大小后面会跟一个字节的字符编码描述如果是用 ISO-8859-1,那这个字节为$00;如果用 Unicode,就是$01本文中,表示使用不同字符集编码的字符,如果字符内有换行符,则用表示空的 Unicode 字符串用可以用以下方式表示,($FF FE 00 00 或者 $FE FF 00 00),即以 Unicode BOM 开头($FF FE 或者 $FE FF),后面紧跟一个结束字符$00 00有三个字节。
