ID3簡介
ID3標籤
ID3是一種metadata容器,多套用於MP3格式的音頻檔案中。它可以將相關的曲名、演唱者、專輯、音軌數等信息存儲在MP3檔案中。
ID3標籤是MP3音樂檔案中的歌曲附加訊息,它能夠在MP3中附加曲子的演出者、作者以及其它類別資訊,方便眾多樂曲的管理。缺少ID3標籤並不會影響 MP3的播放,但若沒有的話,管理音樂檔案也會相當的麻煩。如果你在網上downloadMP3,裡面多半已經寫有預設的ID3訊息。如果你想要將其清除重設,使用WinAMP中的“Alt + 3”熱鍵,就能修改MP3檔案中之的ID3標籤。
ID3Tags
此外,ID3也就是ID3Tags,其中的“Tag”在英文中名詞的一個意思是“標籤”,所以“ID3Tags”也就是“MP3檔案曲目標籤”的意思。
有些地方以“ID3”這樣的簡稱來代表“ID3Tags”,二者本質是一樣的。
標準的制定
如果沒有ID3,那么人們只能根據檔案名稱判斷一首歌它是什麼內容了,何況就算聽出了是什麼歌,它的演唱者、專輯名稱你也未必背得下來,所以給MP3檔案增加內置的標籤是理所當然的事情。有趣的是,MP3的標籤並沒有一個ISO國際標準,ID3的各種版本只是一個近乎事實上的標準,並沒有人強迫播放器或者編碼程式必須支持它。
ID3版本
發明時間
ID3 V1是由Eric Kemp在1996年發明的。ID3 V1是一組附加在音樂檔案後面的數據,它的長度是固定的128位元組。
流派定義
其中流派一共定義了79種,流行的播放軟體Winamp則把它擴展到了125種,從Blues到Noise到Dance Hall,非常豐富,在許多支持ID3編輯的軟體中都可以看到這個列表,但是國內用戶似乎不太在意這個標記,大多數人甚至不知道自己的歌曲到底屬於哪一個分類。
缺陷
這些內容一共只有128個位元組,並不算累贅。由於附加在檔案尾部,所以播放器不必考慮它的影響,即使不支持ID3標記也不會影響音樂的還原——某些很老的播放器確實可能會在播放到這裡的時候發出噪音或者報錯。但是標記在檔案尾部也會造成一個問題,那就是如果還沒有讀到檔案末尾,我們什麼信息也看不到。對硬碟和快閃記憶體裡面的歌曲這當然不是問題,但是如果你通過流媒體方式直接在網路上收聽,就會發現它的缺陷了。
增加曲目序號
細心的人會注意到ID3V1.0沒有包括曲目序號的定義,所以Michael Mutschler在1997年進行了改進,引入了版本1.1。通過占用備註欄位的最後兩個位元組,用一個00位元組作標記,另一個位元組改為序號,可以讓ID3支持曲目編號了。一個位元組的空間讓ID3 V1.1支持最高到255的曲目序號,考慮到一張唱片超過256個曲目的可能性極小,這個改進還是相當合理的。
ID3格式
ID3v1
ID3V1比較簡單,它是存放在MP3檔案的末尾,用16進制的編輯器打開一個MP3檔案,查看其末尾的128個順序存放位元組,數據結構定義如下: char Header[3]; /*標籤頭必須是"TAG"否則認為沒有標籤*/
char Title[30]; /*標題*/
char Artist[30]; /*作者*/
char Album[30]; /*專集*/
char Year[4]; /*出品年代*/
char Comment[30]; /*備註*/
char Genre; /*類型*/
ID3V1的各項信息都是順序存放,沒有任何標識將其分開,比如標題信息不足30個位元組,則使用'\0'補足,否則將造成信息錯誤。Genre使用原碼錶示,對照表如下:/* Standard genres */
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="DeathMetal";
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";
/* Extended genres */
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="HeavyMetal";
138="BlackMetal";
139="Crossover";
140="ContemporaryChristian";
141="ChristianRock";
142="Merengue";
143="Salsa";
144="TrashMetal";
145="Anime";
146="JPop";
147="Synthpop";
ID3V2
ID3V2一共有4個版本,但流行的播放軟體一般只支持第3版,即ID3v2.3。由於ID3V1記錄在MP3檔案的末尾,ID3V2就只好記錄在MP3檔案的首部了。也正是由於這個原因,對ID3V2的操作比ID3V1要慢。而且ID3V2結構比ID3V1的結構要複雜得多,但比前者全面且可以伸縮和擴展。
下面就介紹一下ID3V2.3。
ID3V2.3
概述
每個ID3V2.3的標籤都由一個標籤頭和若干個標籤幀或一個擴展標籤頭組成。關於曲目的信息如標題、作者等都存放在不同的標籤幀中,擴展標籤頭和標籤幀並不是必要的,但每個標籤至少要有一個標籤幀。標籤頭和標籤幀一起順序存放在MP3檔案的首部。
標籤頭
在檔案的首部順序記錄10個位元組的ID3V2.3的頭部。數據結構如下:
char Header[3]; /*必須為"ID3"否則認為標籤不存在*/
char Ver; /*版本號;ID3V2.3就記錄03,ID3V2.4就記錄04*/
char Revision; /*副版本號;此版本記錄為00*/
char Flag; /*存放標誌的位元組,這個版本只定義了三位,稍後詳細解說*/
char Size[4]; /*標籤大小,包括標籤幀和標籤頭。(不包括擴展標籤頭的10個位元組)*/
原文:The ID3v2 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header but not excluding the extended header (total tag size - 10).
1.標誌位元組
標誌位元組一般為0,定義如下:
abc00000
a -- 表示是否使用不同步(一般不設定)
b -- 表示是否有擴展頭部,一般沒有(至少Winamp沒有記錄),所以一般也不設定
c -- 表示是否為測試標籤(99.99%的標籤都不是測試用的啦,所以一般也不設定)
2.標籤大小
一共四個位元組,但每個位元組只用7位,最高位不使用恆為0。所以格式如下
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
計算大小時要將0去掉,得到一個28位的二進制數,就是標籤大小(不懂為什麼要這樣做),計算公式如下:
int total_size;
total_size = Size[0]*0x200000
+Size[1]*0x4000
+Size[2]*0x80
+Size[3]
標籤幀
每個標籤幀都有一個10個位元組的幀頭和至少一個位元組的不固定長度的內容組成。它們也是順序存放在檔案中,和標籤頭和其他的標籤幀也沒有特殊的字元分隔。得到一個完整的幀的內容只有從幀頭中得到內容大小後才能讀出,讀取時要注意大小,不要將其他幀的內容或幀頭讀入。
幀頭的定義如下:
char FrameID[4]; /*用四個字元標識一個幀,說明其內容,稍後有常用的標識對照表*/
char Size[4]; /*幀內容的大小,不包括幀頭,不得小於1*/
char Flags[2]; /*存放標誌,只定義了6位,稍後詳細解說*/
1.幀標識
用四個字元標識一個幀,說明一個幀的內容含義,常用的對照如下:
TIT2=標題 表示內容為這首歌的標題,下同
TPE1=作者
TALB=專集
TRCK=音軌 格式:N/M 其中N為專集中的第N首,M為專集中共M首,N和M為ASCII碼錶示的數字
TYER=年代 是用ASCII碼錶示的數字
TCON=類型 直接用字元串表示
COMM=備註 格式:"eng\0備註內容",其中eng表示備註所使用的自然語言
2.大小
這個可沒有標籤頭的算法那么麻煩,每個位元組的8位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x1000000
+Size[1]*0x10000
+Size[2]*0x100
+Size[3];
3.標誌
只定義了6位,另外的10位為0,但大部分的情況下16位都為0就可以了。格式如下:
abc00000 ijk00000
a -- 標籤保護標誌,設定時認為此幀作廢
b -- 檔案保護標誌,設定時認為此幀作廢
c -- 唯讀標誌,設定時認為此幀不能修改(但我沒有找到一個軟體理會這個標誌)
i -- 壓縮標誌,設定時一個位元組存放兩個BCD碼錶示數字
j -- 加密標誌,(沒有見過哪個MP3檔案的標籤用了加密)
k -- 組標誌,設定時說明此幀和其他的某幀是一組
值得一提的是winamp在保存和讀取幀內容的時候會在內容前面加個'\0',並把這個位元組計算在幀內容的大小中。
附:幀標識的含義
4. Declared ID3v2 frames
The following frames are declared in this draft.
AENC Audio encryption
APIC Attached picture
COMM Comments
COMR Commercial frame
ENCR Encryption method registration
EQUA Equalization
ETCO Event timing codes
GEOB General encapsulated object
GRID Group identification registration
IPLS Involved people list
LINK Linked information
MCDI Music CD identifier
MLLT MPEG location lookup table
OWNE Ownership frame
PRIV Private frame
PCNT Play counter
POPM Popularimeter
POSS Position synchronisation frame
RBUF Recommended buffer size
RVAD Relative volume adjustment
RVRB Reverb
SYLT Synchronized lyric/text
SYTC Synchronized tempo codes
TALB Album/Movie/Show title
TBPM BPM (beats per minute)
TCOM Composer
TCON Content type
TCOP Copyright message
TDAT Date
TDLY Playlist delay
TENC Encoded by
TEXT Lyricist/Text writer
TFLT File type
TIME Time
TIT1 Content group description
TIT2 Title/songname/content description
TIT3 Subtitle/Description refinement
TKEY Initial key
TLAN Language(s)
TLEN Length
TMED Media type
TOAL Original album/movie/show title
TOFN Original filename
TOLY Original lyricist(s)/text writer(s)
TOPE Original artist(s)/performer(s)
TORY Original release year
TOWN File owner/licensee
TPE1 Lead performer(s)/Soloist(s)
TPE2 Band/orchestra/accompaniment
TPE3 Conductor/performer refinement
TPE4 Interpreted, remixed, or otherwise modified by
TPOS Part of a set
TPUB Publisher
TRCK Track number/Position in set
TRDA Recording dates
TRSN Internet radio station name
TRSO Internet radio station owner
TSIZ Size
TSRC ISRC (international standard recording code)
TSSE Software/Hardware and settings used for encoding
TYER Year
TXXX User defined text information frame
UFID Unique file identifier
USER Terms of use
USLT Unsychronized lyric/text transcription
WCOM Commercial information
WCOP Copyright/Legal information
WOAF Official audio file webpage
WOAR Official artist/performer webpage
WOAS Official audio source webpage
WORS Official internet radio station homepage
WPAY Payment
WPUB Publishers official webpage
WXXX User defined URL link frame
ID3讀取
mp3的id3信息存放在mp3檔案結尾處的128位元組處,結構如下:
type ID3struct =packed record
ID:array[0..2] of char
title :array[0..29] of char;
artist:array[0..29] of char;
album:array[0..29} of char;
year:array[0..3] of char;
comment:array[0..29] of char;
genre:byte;
用指針讀出相應位置的數據,就可以讀出ID3信息:
program showID3;
{$apptype console}
var
tempfile:file of byte; //tempfile指針,二進制型檔案
i:integer;
x:byte;
begin
assign(tempfile,)
reset(tempfile);//檔案關聯,復位
seek(tempfile,(filesize(tempfile)-128)); //指針指向距檔案結尾128位元組處
writeln('ID:');
for i:=0 to 2 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln;
writeln('title:');
for i:=0 to 29 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln;
writeln('artist:');
for i:=0 to 29 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln;
writeln('album:');
for i:=0 to 29 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln;
writeln('year:');
for i:=0 to 3 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln;
writeln('comment:');
for i:=0 to 29 do
begin
read(tempfile,x);
write(chr(x));
end;
writeln; //用循環的方法依次讀出各個位元組
close(tempfile);
end.
玩轉ID3
聲色俱全
不知道你有沒有這樣的經歷,一些從網上下載的MP3音樂,檔案名稱明明是01、02這樣的序號,但播放時卻能顯示出歌曲的正確名稱來,是不是有點奇妙?不過這沒有什麼,再看看下面這張圖,播放器里不但有歌曲名稱,還顯示出了歌詞和歌手的圖片,是不是更酷啊?這其實都是ID3在暗中相助,只要看完這篇文章,你也能做到,讓我們開始非同一般的音樂之旅吧……。
尋根溯源
ID3是什麼 MP3和一般的聲音檔案不同,除音頻信息外,還包含該音樂的歌手名稱、專輯名稱、歌名、備註等附加信息,我們把這些附加信息稱為ID3 Tag,也就是ID3標記。起初MP3並不能保存這些信息,直到1996年,一個叫做Eric Kemp的人製作了Studio3軟體,它可以在MP3檔案的最後部分增加固定的128位元組小塊數據,用來記錄音樂的信息。很快,MP3ext的作者Michael Mutschler又將這個標記進行了擴展,並正式將其命名為ID3,而且還使用注釋的最後兩個位元組來記錄CD和音樂的來源,其版本被定為ID3v1.1。不過ID3v1版本的限制太多,比如歌曲名長度被限制在30個英文字母,稍長一點的曲名就會被截掉,讓人頭痛不已。在這種情況下,它的升級版本ID3v2出現了。它首先解除了128個位元組的限制,各個欄位的長度也是彈性可變的,使可包含的音樂信息更為豐富,除了歌名、專輯名、演唱者外,還可保存歌詞、均衡器設定、圖片等信息。ID3v2的設計更靈活,擴展性更強,並且支持Unicode,因此歌詞信息支持多語言。ID3v2甚至能包含一個檔案,所以未來的MP3可能會附帶有視頻檔案,讓你不僅能聽,還可以看。微軟的Windows Midia Player就能很好地支持ID3v2,甚至在Windows XP中,你不需要打開任何播放器,只要進入一個存放MP3的資料夾,系統就能讀取ID3v2的信息來對檔案分類排列。
有關Windows XP對MP3音樂資料夾的支持,請參看本刊2004年第11期系統套用欄目中的《用好Windows XP的音樂大管家》。
選對工具
為MP3加上標籤筆者平時喜歡從網上下載MP3歌曲,積累得多了找起歌來就很不方便,既然知道了ID3那么大的功用,何不藉助它來管理一下呢。工欲善其事,必先利其器。首先在網上下載了多個ID3編輯軟體,通過試用比較,最終確定了用Tagℜname。它是一個非常強大的媒體檔案標籤編輯和重命名工具,除支持多種格式標籤外,它還有一項獨特功能,就是能從檔案名稱倒查標籤信息(下文主要針對的是ID3v2版本)。
Tagℜname小檔案
軟體版本:3.01
軟體大小:1789 KB軟體性質:免費軟體
適用平台:Windows 9x/ME/2000/XP
第一步:為了提高編輯ID3的效率,我首先儘可能地把硬碟上的歌曲按照歌手的名字分開在不同資料夾中保存,每個歌手下面又按不同的專輯名分開保存。第二步:啟動Tagℜname,可以看到主界面上方是標籤信息欄面板,左下方是資料夾視窗。選中一個存放某張專輯的資料夾,Tagℜname就會將裡面的MP3檔案讀取到右邊的視窗,並顯示出MP3的檔案名稱和標籤信息。按鍵盤上的Alt 2鍵切換到ID3v2模式。第三步:這時要分成兩種情況:一種情況是MP3檔案是胡亂命名的,各個標籤欄位也是空白的,總之沒有任何可利用的信息。另一種情況就是MP3檔案名稱含有歌曲名或歌手的名字,如“專輯名_曲目號.MP3”、“曲目號_曲名.MP3”等,或者有部分歌曲已經填好標籤。
(1)第一種情況:這種情況下只能手工填寫全部標籤信息。按F3鍵進入“多檔案標籤編輯器”標籤,再按Ctrl A鍵選中所有的檔案,接著勾選標籤信息欄中的“藝術家”選項,然後在其右側的文本框裡填上歌手的名字,單擊“保存標籤”按鈕,即可批量修改所有選中歌曲中的“藝術家”項了。以此類推,可以批量填寫專輯、年份、流派等項。接下來填寫歌曲名稱和歌詞。由於歌曲名稱及歌詞是每首歌獨有的,所以不能用批量方法來填寫。按F5鍵打開標籤編輯器,在“標題”一欄中填上歌曲名稱,再單擊上方的“歌詞”選項卡切換到歌詞編輯界面,填入歌詞。如果你已經將歌詞保存為文本檔案,可通過下面的“從文本檔案載入”按鈕來添加歌詞,免了複製貼上的辛苦。其他的信息,像年代、圖片什麼的,可根據自己的喜好來決定是否添加。全部填好後,單擊右下角的“保存並下一個”按鈕進入下一個檔案的編輯,直到編輯完所有的歌曲為止。小提示到哪裡去找歌詞?著名的百度搜尋引擎提供有歌詞搜尋功能,只要進入,輸入歌名,並選擇“歌詞”即可快速找到需要的歌詞。
(2)第二種情況:這種情況下工作量將會小得多,我們可以將檔案名稱中有用信息提取出來反存到標籤中。按F4鍵切換到“從檔案名稱獲取標籤”視窗,裡面有“檔案名稱掩碼”設定。這裡要舉例說明一下:如果你的歌曲檔案名稱的規則是“音軌.曲名.MP3”(像“03.白雲.MP3”這樣的,這裡的“03”是音軌號,“白雲”是歌曲名),可以從右邊列出的檔案名稱變數中查出音軌對應的變數是“%6”,歌曲名對應的變數是“%2”,此時,檔案名稱掩碼就應該是“%6.%2”。填好掩碼後點擊右邊的“測試”按鈕,看看獲得的標籤是不是正確的,確認無誤後點擊下方的“寫入標籤”按鈕完成標籤的添加。如果在整張專輯中,有一兩首歌曲已經填好標籤信息,我們還可以將這一兩首歌中含有的信息複製到其他歌曲中。方法是:先Ctrl A鍵選中所有的檔案,然後再單擊一下含有標籤信息的歌曲使它加亮顯示,點擊“從加亮的檔案複製”按鈕,這首歌曲的標籤含有的信息就複製到左面的信息欄了,然後將你想要複製到其他檔案中的那一欄信息選中,再點擊“保存標籤”就可以了。二:
id3還是quake系列3d遊戲引擎的數據格式