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

�c00000

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

�c00000 %ijk00000

DATA

Frame Size

$xx ...

...

...

...

...

Frame

Frame ID

4

"AENC"/"APIC"/"COMM"/...

Frame Size

4

$xx xx xx xx

Flags

2

�c00000 %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

�c00000

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

 

      扩展标签头大小,现在可以是610个字节,不包括它自己。补白大小就是整个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是由大写英文字母AZ,数字09组成的长度为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)标识其字节顺序。

      全数字字符串和超链接总是用ISO-8859-1字符集编码。用ISO-8859-1字符编码时,结束字符用$00,而Unicode$00 00表示。如没特别说明,换行符是禁止使用的。如果允许使用换行符,用ISO-8859-1字符编码时,换行用$0A表示。如果帧数据允许使用不同的字符集编码,那么在帧大小后面会跟一个字节的字符编码描述。如果是用ISO-8859-1,那这个字节为$00;如果用Unicode,就是$01。本文中,<text string according to encoding>表示使用不同字符集编码的字符,如果字符内有换行符,则用<full text string according to encoding>表示。空的Unicode字符串用可以用以下方式表示,($FF FE 00 00 或者 $FE FF 00 00),即以Unicode BOM开头($FF FE 或者 $FE FF),后面紧跟一个结束字符$00 00

 

      有三个字节是用来定义帧内容使用的是什么语言,定义是根据ISO-639-2

      所有超链接都是用相对路径,例如: "picture.png", "../doc.txt"

      如果帧实际内容的比帧大小所定义还要大,例如你要增加一些本文所没有提到的信息,这会在以后更新的版本实现。版本的信息存放在标签头内。

 

3.3.1 帧标识

      在帧大小后面是两个字节的帧标识。所有未使用的标识位都要设为0。帧标识的第一个字节是状态信息,第二个字节是为了编码用的。如果在第一字节中未定义的标识位被置1,那么帧的内容是不可以修改的,除非那位标识位清零。如果在第二字节中有未定义的标识位被置1,那么帧的内容可能根本就不可读。帧标识的定义如下:

      �c00000 %ijk00000

      a - 标签改变保留位

      如果当前帧是未定义或者不可读的,这位标识位告诉软件当在标签信息改变时,如何处理当前帧。标签信息改变包括添加补白数据,重新对帧排序等。

      0    帧被保留

      1    帧被丢弃

 

      b - 文件改变保留位

      如果当前帧是未定义或者不可读的,这位标识位告诉软件当文件(不包括标签信息)改变时,如何处理当前帧。但如果音频文件是全部被替换的话,这种情况是例外的。

      0    帧被保留

      1    帧被丢弃

     

      c - 只读

      将这位置1则告诉软件本帧内容是只读的。改变本帧的内容可能会损坏文件,例如数字签名。如果你根本不知道为什么这一帧要设为只读,而你又要改变此帧内容,而且不想再做其它的修复操作,例如重新计算数字签名,这位标识位应该清零。

 

      i - 压缩

      这位标识位表示当前帧是否经过压缩。

      0    帧未经过压缩

      1    帧用[#ZLIB zlib]压缩,在帧头的后面有4个字节的解压缩大小

 

      j - 加密

      这位标识位表示当前帧是否经过加密。如果这位置1,则在帧头后面会有一个字节的数据表示是用哪种方式加密的。详情见第四章第26节。

      0    帧未经过加密

      1    帧经过加密

 

      k - 分组标识

      该标识位表示当前帧是否隶属于其它帧下的分组。如果该位置1,则在帧头附加分组标识字节。具体相同分组标识的帧属于同一分组。

      0    帧内不包含有分组标识信息

      1    帧内包含有分组标识信息

 

      某些标识位表示帧头会增加一些扩展信息。这些附加信息的顺序与对应标识位的顺序是一样的。例如4字节的解压缩大小信息会在加密方式之前(因为标识位i在标识位j之前)。这些附加的数据的大小不是算在帧头大小里面,而是算在帧大小里面,而且这些附加信息是不需要经过压缩或加密的。

3.4 默认的帧标识

      本文内所有帧类型的帧标识设置可以分为以下几类。

 

标签信息改变

文件改变

帧类型

丢弃

丢弃

丢弃

保留

保留

丢弃

AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN, TSIZ

保留

保留

其它帧类型

      (上表的意思是:对于AENC/ETCO/EQUA/...类型的帧,虽然标签信息改变了,这类型的帧还会保留下来,但如果文件改变了,这类型的帧会被丢弃。)

4 ID3v2

       下面列出了本文中所定义的所有帧:

4.20    AENC    [#sec4.20 Audio encryption]
4.15    APIC    [#sec4.15 Attached picture]
4.11    COMM    [#sec4.11 Comments]
4.25    COMR    [#sec4.25 Commercial frame]
4.26    ENCR    [#sec4.26 Encryption method registration]
4.13    EQUA    [#sec4.13 Equalization]
4.6     ETCO    [#sec4.6 Event timing codes]
4.16    GEOB    [#sec4.16 General encapsulated object]
4.27    GRID    [#sec4.27 Group identification registration]
4.4     IPLS    [#sec4.4 Involved people list]
4.21    LINK    [#sec4.21 Linked information]
4.5     MCDI    [#sec4.5 Music CD identifier]
4.7     MLLT    [#sec4.7 MPEG location lookup table]
4.24    OWNE    [#sec4.24 Ownership frame]
4.28    PRIV    [#sec4.28 Private frame]
4.17    PCNT    [#sec4.17 Play counter]
4.18    POPM    [#sec4.18 Popularimeter]
4.22    POSS    [#sec4.22 Position synchronisation frame]
4.19    RBUF    [#sec4.19 Recommended buffer size]
4.12    RVAD    [#sec4.12 Relative volume adjustment]
4.14    RVRB    [#sec4.14 Reverb]
4.10    SYLT    [#sec4.10 Synchronized lyric/text]
4.8     SYTC    [#sec4.8 Synchronized tempo codes]
4.2.1   TALB    [#TALB Album/Movie/Show title]
4.2.1   TBPM    [#TBPM BPM (beats per minute)]
4.2.1   TCOM    [#TCOM Composer]
4.2.1   TCON    [#TCON Content type]
4.2.1   TCOP    [#TCOP Copyright message]
4.2.1   TDAT    [#TDAT Date]
4.2.1   TDLY    [#TDLY Playlist delay]
4.2.1   TENC    [#TENC Encoded by]
4.2.1   TEXT    [#TEXT Lyricist/Text writer]
4.2.1   TFLT    [#TFLT File type]
4.2.1   TIME    [#TIME Time]
4.2.1   TIT1    [#TIT1 Content group description]
4.2.1   TIT2    [#TIT2 Title/songname/content description]
4.2.1   TIT3    [#TIT3 Subtitle/Description refinement]
4.2.1   TKEY    [#TKEY Initial key]
4.2.1   TLAN    [#TLAN Language(s)]
4.2.1   TLEN    [#TLEN Length]
4.2.1   TMED    [#TMED Media type]
4.2.1   TOAL    [#TOAL Original album/movie/show title]
4.2.1   TOFN    [#TOFN Original filename]
4.2.1   TOLY    [#TOLY Original lyricist(s)/text writer(s)]
4.2.1   TOPE    [#TOPE Original artist(s)/performer(s)]
4.2.1   TORY    [#TORY Original release year]
4.2.1   TOWN    [#TOWN File owner/licensee]
4.2.1   TPE1    [#TPE1 Lead performer(s)/Soloist(s)]
4.2.1   TPE2    [#TPE2 Band/orchestra/accompaniment]
4.2.1   TPE3    [#TPE3 Conductor/performer refinement]
4.2.1   TPE4    [#TPE4 Interpreted, remixed, or otherwise modified by]
4.2.1   TPOS    [#TPOS Part of a set]
4.2.1   TPUB    [#TPUB Publisher]
4.2.1   TRCK    [#TRCK Track number/Position in set]
4.2.1   TRDA    [#TRDA Recording dates]
4.2.1   TRSN    [#TRSN Internet radio station name]
4.2.1   TRSO    [#TRSO Internet radio station owner]
4.2.1   TSIZ    [#TSIZ Size]
4.2.1   TSRC    [#TSRC ISRC (international standard recording code)]
4.2.1   TSSE    [#TSEE Software/Hardware and settings used for encoding]
4.2.1   TYER    [#TYER Year]
4.2.2   TXXX    [#TXXX User defined text information frame]
4.1     UFID    [#sec4.1 Unique file identifier]
4.23    USER    [#sec4.23 Terms of use]
4.9     USLT    [#sec4.9 Unsychronized lyric/text transcription]
4.3.1   WCOM    [#WCOM Commercial information]
4.3.1   WCOP    [#WCOP Copyright/Legal information]
4.3.1   WOAF    [#WOAF Official audio file webpage]
4.3.1   WOAR    [#WOAR Official artist/performer webpage]
4.3.1   WOAS    [#WOAS Official audio source webpage]
4.3.1   WORS    [#WORS Official internet radio station homepage]
4.3.1   WPAY    [#WPAY Payment]
4.3.1   WPUB    [#WPUB Publishers official webpage]
4.3.2   WXXX    [#WXXX User defined URL link frame]

4.1 <文件唯一标识帧>(UFID)

      该 帧的目的是让拥有更多相关信息的数据库可以根据此帧识别出某个音频文件。但这类型的数据库标准不在本文的讨论范围之内,超链接帧或连接帧,里面可能包含负 责维护该类型数据库组织的电子邮箱信息。如有任何问题,请发信到他们的电邮询问。超链接帧里面的超链接不可以直接访问数据库。以下字符串是用作测试的:"http://www.id3.org/dummy/ufid.html"如果不是特别说明,软件可以将此帧删除。“所有者标识符”一定不可以为空。“所有者标识符”后面就是最长可达64字节的文件的真正唯一的标识符。在ID3v2标签信息内可以有不只一个<文件唯一标识帧>UFID),但每一个<文件唯一标识帧>的“所有者标识符”都要是唯一的。

         <文件唯一标识帧> ID  UFID

     “所有者标识符”             <text string> $00

                                               标识   64字节数据

4.2 文本信息帧

      文本信息帧是最重要的帧,它包含了演唱者,专辑名等的信息。不同类型的文本信息帧在ID3v2标签信息中可能只有一个。如果文本信息帧的帧内容中,有一个字符串后面紧跟一个结束字符($00$00 00),那么它后面的信息应该忽略掉并不把它打印出来。所有文本信息帧的帧ID都是以"T"开头的,除了"TXXX"帧以外。文本信息帧的格式如下:

   ID    "T000" - "TZZZ" , 除了"TXXX"

文本编码 $xx

文本信息 <text string according to encoding>

4.2.1 文本信息帧详解

TALB     专辑名

TBPM    拍子

TCOM    作曲家

TCON    音乐类型

TCOP    版权

TDAT    灌录日期

TDLY     播放延时

TENC    编码者

TEXT     填词人

TFLT     文件类型

TIME     灌录时间

TIT1     内容组别

TIT2     歌名

TIT3     歌名副标题

TKEY     音调

TLAN    语言

TLEN     音频长度

TMED    媒体类型

TOAL    原唱片集

TOFN    原文件名

TOLY     原歌词

TOPE    原艺术家/演唱者

TORY    原发行年份

TOWN   文件的所有者

TPE1     主唱

TPE2     乐队/管弦乐队/伴奏

TPE3     指挥家

TPE4     翻唱/混音/改编

TPOS    片段来源

TPUB    出版商

TRCK    音轨号

TRDA    灌录时期

TRSN    网络电台名

TRSO    网络电台所有者

TSIZ     音频长度

TSRC    国际灌录编码标准

TSSE    软硬编码

TYER     灌录年份

5 非同步编码

      非同步编码的目的是让ID3v2标签信息尽量与现有软件兼容。如果用的是支持ID3v2的最新软件,那么非同步编码就没有意义了。非同步编码只针对MPEG 2 layer I,II,IIIMPEG 2.5文件。

      如果在ID3v2标签信息内有一段数据刚好与MP3文件格式的同步信号相同,(我们将这段数据称为“伪同步信号”),那么就在伪同步信号的第一个字节后插入一个字节的全0数据。在ID3v2内的伪同步信号经过非同步编码后如下:

非同步编码前:111111 111xxxxx

非同步编码后:111111 00000000 111xxxxx

      非同步编码的副作用是使所有$FF 00都会变为$FF 00 00 这样音频解码软件就不会被ID3v2内的伪同步信号影响。

      如果ID3v2标签信息经过非同步编码,请将ID3v2标签头标识的最高位置1。只有当ID3v2标签信息内含有伪同步信号才将此位置1,否则请设为0 

      请紧记:如果ID3v2标签信息内容是经过压缩的,非同步编码应该是在压缩之后再进行的。解压时就要先进行非同步解码,再解压缩。

      如果ID3v2标签信息的最后一个字节是$FF,为了消除伪同步信号,至少要添加一个字节的补白数据。

(注:MP3的同步信号是13位的全1数据,即111111 1xxxxx)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值