ID3標籤是MP3檔案中用於描述音樂信息的數據元素(metadata)。我們知道,MP3實際上是MPEG 1 Layer 3的縮寫,它只定義了一種數據壓縮方式,並沒有特別說明如何在檔案中添加描述音樂本身的信息。ID3的出現解決了這個問題,它通過在MP3數據前面或者後面添加描述信息,讓管理和組織MP3更容易。
ID3目前有多個版本,最常見的是ID3 V1.1和ID3 V2.4。
ID3的版本
如果沒有ID3,那么人們只能根據檔案名稱判斷一首歌它是什麼內容了,何況就算聽出了是什麼歌,它的演唱者、專輯名稱你也未必背得下來,所以給 MP3檔案增加內置的標籤是理所當然的事情。有趣的是,MP3的標籤並沒有一個ISO國際標準,ID3的各種版本目前只是一個近乎事實上的標準,並沒有人強迫播放器或者編碼程式必須支持它。
根據維基百科全書的解釋,ID3 V1是由Eric Kemp在1996年發明的。ID3 V1是一組附加在音樂檔案後面的數據,它的長度是固定的128位元組。ID3V1.0的定義如下表:
其中流派一共定義了79種,流行的播放軟體Winamp則把它擴展到了125種,從Blues到Noise到Dance Hall,非常豐富,在許多支持ID3編輯的軟體中都可以看到這個列表,但是國內用戶似乎不太在意這個標記,大多數人甚至不知道自己的歌曲到底屬於哪一個分類。
這些內容一共只有128個位元組,並不算累贅。由於附加在檔案尾部,所以播放器不必考慮它的影響,即使不支持ID3標記也不會影響音樂的還原——某些很老的播放器確實可能會在播放到這裡的時候發出噪音或者報錯。但是標記在檔案尾部也會造成一個問題,那就是如果還沒有讀到檔案末尾,我們什麼信息也看不到。對硬碟和快閃記憶體裡面的歌曲這當然不是問題,但是如果你通過流媒體方式直接在網路上收聽,就會發現它的缺陷了。
細心的人會注意到ID3V1.0沒有包括曲目序號的定義,所以Michael Mutschler在1997年進行了改進,引入了版本1.1。通過占用備註欄位的最後兩個位元組,用一個00位元組作標記,另一個位元組改為序號,可以讓 ID3支持曲目編號了。一個位元組的空間讓ID3 V1.1支持最高到255的曲目序號,考慮到一張唱片超過256個曲目的可能性極小,這個改進還是相當合理的。
有趣的工具—MP3ext
MP3ext是Windows的一個擴展工具,讓你可以直接在Windows瀏覽器裡面查看和編輯MP3標記信息,還能直接用圖示告訴你檔案的編碼速率。它是一個功能強大的免費軟體,不過目前它對中文編碼的支持還不算完美。另外,你有沒有注意到它的作者就是ID3 V1.1的發明人? ID3V1和V1.1實際上要求使用ISO 8859-1拉丁字母編碼,但是很多人為了方便直接使用自己當前作業系統的代碼頁。大多數情況下這不算什麼問題,但是在跨越語言平台的時候就會出現亂碼等情況。例如你在中文作業系統下查看西班牙語的歌曲信息,可能就會看到奇怪的亂碼,甚至某些ID3編輯軟體可能處理不了中文。
隨著ID3套用的普及,人們逐漸發現ID3V1過於簡單了,很多感興趣的信息無法加入,比如作曲者、歌詞、演奏者、指揮等等進一步的信息無法附著其上,甚至連比較長的曲目名都處理不了,於是ID3V2的出現也就是順理成章的了。
與死板的ID3V1不同,ID3V2是一個靈活的標籤格式,它不但提供了更豐富的預定義欄位和更長的數據空間,而且支持用戶自定幀,它的長度也是可變的。於是,利用ID3V2,我們不但可以讓MP3附帶歌詞,而且可以包括唱片封面圖片、音色調節設定、甚至MTV影像和卡拉OK字幕。
ID3V2的靈活性和可擴展性讓用戶可以給音樂檔案添加任何想得出來的相關信息。它支持最大256MB的數據,最長的數據幀可以達到16MB。所以如果你願意,ID3V2增加的數據可以讓附加信息龐大到比歌曲信息本身還要占據更多空間的地步。
預設狀況下,ID3V2附加於檔案頭部,但是這也不會影響不支持ID3V2的播放器,因為它特意設計為用“非同步”方式儲存信息,不兼容的播放器會簡單地跳過這一部分。在ID3V2.4的版本中用戶也可以選擇把它附加到檔案尾部。把信息放到檔案頭部對於流媒體播放來說有很大優勢——在聽到音樂之間關於樂曲本身的信息就已經可以顯示了。但是這么做的缺點是如果用工具軟體改變了ID3的長度,那么整個檔案都需要重新寫入,效率受到影響。另外,ID3V2支持UNICODE,不同語言的信息可以比較好地互相兼容。
MP3之ID3v1,ID3v2.3結構讀/寫模組
MP3檔案的“ID3v1信息”。這個信息結構提取起來非常容易,寫入到檔案也不是什麼難事。但是它的信息安排和可擴展性卻非常之差(只能128個位元組)。就如你所知,MP3檔案還有另外的一個信息結構,這個結構具有更好的可擴展性,而且存儲的容量也不受限制(也就是總長度不固定)。這個信息就是 ID3v2信息(相對ID3v1而言)。由於ID3v1信息存儲在了檔案的最後128個位元組里,那么ID3v2就不得不放棄選擇存儲在檔案的末尾了,於是它被存儲在了檔案的起始位置。
ID3v2信息的存儲和讀取遠遠要比ID3v1信息複雜的多。這是因為ID3v2信息不再固定,而且由於這段信息存儲在了檔案的首端,所以重新寫入的時候也遠比ID3v1麻煩的多。
我用儘可能清楚而且簡練的話,給大家講一下ID3v2信息的讀取方法。ID3v2到現在一共有4個版本,不過比較流行的MP3播放軟體一般只支持第 3版,即ID3v2.3。我們要讀取的就是ID3v2.3信息。ID3v2信息包括兩個部分,一個部分是標頭信息,另一個部分是標體信息。其中標頭信息占固定的十個位元組,
每個ID3V2的標籤部一個標籤頭和若干個標籤幀或一個擴展標籤組成關於曲目的信息如標題、作者等都放在在不同的標籤幀中,擴展標籤頭和標籤幀關不是必要的,但每個標籤至少要有一個標籤頭和標籤幀一直順序存放在MP3檔案首部。
附:
FrameID 幀標:用四個字元標識一個幀的內容含義,常用的對照如下:
TEXT: 歌詞作者
TENC: 編碼
WXXX: URL連結(URL)
TCOP: 著作權(Copyright)
TOPE: 原藝術家
TCOM: 作曲家
TDAT: 日期
TPE3: 指揮者
TPE2: 樂隊
TPE1: 藝術家相當於ID3v1的Artist
TPE4: 翻譯(記錄員、修改員)
TYER: 年代相當於ID3v1的Year
USLT: 歌詞
TALB: 專輯相當於ID3v1的Album
TIT1: 內容組描述
TIT2: 標題相當於ID3v1的Title
TIT3: 副標題
TCON: 流派(風格)相當於ID3v1的Genre見下表
TBPM: 每分鐘節拍數
COMM: 注釋相當於ID3v1的Comment
TDLY: 播放列表返錄
TRCK: 音軌(曲號)相當於ID3v1的Track
TFLT: 檔案類型
TIME: 時間
TKEY: 最初關鍵字
TLAN: 語言
TLEN: 長度
TMED: 媒體類型
TOAL: 原唱片集
TOFN: 原檔案名稱
TOLY: 原歌詞作者
TORY: 最初發行年份
TOWM: 檔案所有者(許可證者)
TPOS: 作品集部分
TPUB: 發行人
TRDA: 錄製日期
TRSN: Intenet電台名稱
TRSO: Intenet電台所有者
TSIZ: 大小
TSRC: ISRC(國際的標準記錄代碼)
TSSE: 編碼使用的軟體(硬體設定)
UFID: 唯一的檔案標識符
AENC: 音頻加密技術