ID3 是一个元数据(metadata) 的容器,通常和 MP3 文件一起。

ID3 有两个版本:

  • ID3v1
  • ID3v2

ID3v1

ID3v1 比较简单,存放在 MP3 文件末尾,占用 128 个字节,使用任意一个 16 进制编辑器打开 MP3,就可以看到。

V1 版本以 TAG 字符开始,记录了 MP3 文件的歌手名,标题,专辑名称,年代,风格等信息。

字节 长度 说明
1-3 3 TAG 字符,说明 ID3v1 开始
4-33 30 歌曲名
34-63 30 歌手
64-93 30 专辑名
94-97 4 年份
98-127 30 附注
128 1 音乐类别,147 种1

ID3v2

ID3v2 版本位于 mp3 开头,长度可变。

ID3v2 有四个版本

  • ID3v2.1
  • ID3v2.2
  • ID3v2.3
  • ID3v2.4

因为在文件开头,所以对 ID3v2 版本的操作要比 ID3v1 慢。

以 ID3v2.3 为例,由一个标签头和若干标签帧组成,至少有一个标签帧,每个标签帧记录一种信息,比如标题,作曲家等等。

可以通过 vim 打开 mp3 文件,然后执行 %!xxd 以 16 进制查看。

mp3 id3

文件开头长度 10 字节,结构如下:

char Header[3];    /*必须为“ID3”否则认为标签不存在*/
char Ver;         /*版本号ID3V2.3 就记录3*/
char Revision;     /*副版本号此版本记录为0*/
char Flag;        /*标志字节,只使用高三位,其它位为0 */
char Size[4];      /*标签大小*/

说明:

  • Flag,一般使用高三位
    • 第一位表示是否使用 Unsynchronisation
    • 第二位表示是否有扩展头部
    • 第三位是否是测试标签
  • 标签大小是指包括标签头的 10 字节在内的所有标签帧的大小,每个字节只使用后 7 位,最高位为 0
    • 计算大小时将最高位去掉,得到 28 位二进制数,就是标签大小

标签帧

每个标签帧都有 10 个字节的帧和至少一个字节的不固定长度的内容组成。

帧头部:

char FrameID[4];   /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
char Size[4];    /*帧内容的大小,不包括帧头,不得小于 1*/
char Flags[2];    /*存放标志,只定义了 6 位*/

说明:

  • 帧标识,四个字符标识一个帧
    • TIT2 歌曲标题
  • 大小,每个字节的 8 位全部使用
  • 标志,只定义了前 6 位

MP3 文件结构

大体上分三个部分:

  • ID3v2
  • 音频数据
  • ID3v1

附录

0="Blues";
1="ClassicRock";
2="Country";
3="Dance";
4="Disco";
5="Funk";
6="Grunge";
7="Hip-Hop";
8="Jazz";
9="Metal";
10="NewAge";
11="Oldies";
12="Other";
13="Pop";
14="R&B";
15="Rap";
16="Reggae";
17="Rock";
18="Techno";
19="Industrial";
20="Alternative";
21="Ska";
22="Deathl";
23="Pranks";
24="Soundtrack";
25="Euro-Techno";
26="Ambient";
27="Trip-Hop";
28="Vocal";
29="Jazz+Funk";
30="Fusion";
31="Trance";
32="Classical";
33="Instrumental";
34="Acid";
35="House";
36="Game";
37="SoundClip";
38="Gospel";
39="Noise";
40="AlternRock";
41="Bass";
42="Soul";
43="Punk";
44="Space";
45="Meditative";
46="InstrumentalPop";
47="InstrumentalRock";
48="Ethnic";
49="Gothic";
50="Darkwave";
51="Techno-Industrial";
52="Electronic";
53="Pop-Folk";
54="Eurodance";
55="Dream";
56="SouthernRock";
57="Comedy";
58="Cult";
59="Gangsta";
60="Top40";
61="ChristianRap";
62="Pop/Funk";
63="Jungle";
64="NativeAmerican";
65="Cabaret";
66="NewWave";
67="Psychadelic";
68="Rave";
69="Showtunes";
70="Trailer";
71="Lo-Fi";
72="Tribal";
73="AcidPunk";
74="AcidJazz";
75="Polka";
76="Retro";
77="Musical";
78="Rock&Roll";
79="HardRock";

80="Folk";
81="Folk-Rock";
82="NationalFolk";
83="Swing";
84="FastFusion";
85="Bebob";
86="Latin";
87="Revival";
88="Celtic";
89="Bluegrass";
90="Avantgarde";
91="GothicRock";
92="ProgessiveRock";
93="PsychedelicRock";
94="SymphonicRock";
95="SlowRock";
96="BigBand";
97="Chorus";
98="EasyListening";
99="Acoustic";
100="Humour";
101="Speech";
102="Chanson";
103="Opera";
104="ChamberMusic";
105="Sonata";
106="Symphony";
107="BootyBass";
108="Primus";
109="PornGroove";
110="Satire";
111="SlowJam";
112="Club";
113="Tango";
114="Samba";
115="Folklore";
116="Ballad";
117="PowerBallad";
118="RhythmicSoul";
119="Freestyle";
120="Duet";
121="PunkRock";
122="DrumSolo";
123="Acapella";
124="Euro-House";
125="DanceHall";

126="Goa";
127="Drum&Bass";
128="Club-House";
129="Hardcore";
130="Terror";
131="Indie";
132="BritPop";
133="Negerpunk";
134="PolskPunk";
135="Beat";
136="ChristianGangstaRap";
137="Heavyl";
138="Blackl";
139="Crossover";
140="ContemporaryChristian";
141="ChristianRock";
142="Merengue";
143="Salsa";
144="Trashl";
145="Anime";
146="JPop";
147="Synthpop";

reference

  1. 见附录