linux下使用C獲取mp3 ID3資料時的一些注意事項(v1,v2.3,v2.4)
最近自己寫了一個獲取ID3資料的函式,剛開始也是在網上找了大量的資料,眾說紛紜,當時我也是被搞得有點暈了,所以現在結合他人的資料把我自己覺得應該注意的地方寫下來。以便以後檢視。
首先科普下mp3幀的知識:
MP3檔案是由幀構成,幀是 MP3檔案的最小組成單位。根據幀性質的不同,檔案大體分為四個部分:ID3v2標籤幀、資料幀、APEV2標籤幀、ID3v1標籤幀,而只有資料幀才是必需的。
資料幀包含了歌曲的壓縮資料。標籤幀提供了歌曲的演唱者、歌名、專輯、年份等資訊。
一、V1版本
ID3v1 在檔案結尾,以字串“TAG”為標識,其長度是固定的 128 個位元組。
ID3V1結構
--------------------------------------------------------------------
名稱 位元組 說明
--------------------------------------------------------------------
Tag 3 ID3V1識別符號“TAG”的Ascii碼
Title 30 歌曲名
Artist 30 歌手名
Album 30 專輯名
Year 4 日期資訊
Comment 28 註釋資訊,有時為30位元組
Reserved 1 =0說明有音軌,下一位元組就是音軌;≠0表示註釋是30個位元組
Track 1 音軌(位元組型數值),歌曲在專輯裡的序號
Genre 1 歌曲風格(位元組型數值)
--------------------------------------------------------------------
備註:
1、歌曲的風格總共148種,具體資訊可上網查閱。Genre是個usigned char,轉換成數字之後即為該歌曲的風格編號,即可知道其歌曲風格的字串。
2、V1版本沒有指定具體的編碼格式,不過可預設為GBK編碼,一般來說不會錯的。
3、如果MP3的註釋=30位元組,那麼就要佔用 Reserved 和 Track 兩個位元組,這要看 Reserved 是否=0,如果=0,那麼註釋有 28 個位元組。如果不是,那麼註釋有 30 個位元組。當註釋=30 個位元組的時候,那就沒有 Track 了。
二、V2版本
ID3V2 與 ID3V1 的作用差不多,也是記錄 mp3 的有關資訊,但 ID3V2 的結構比 ID3V1 要複雜得多,而且可以伸縮和擴充套件。ID3V2 到現在一共有 4 個版本,但流行的播放軟體一般只支援第 3 版,既ID3V2.3。由於ID3V1記錄在
MP3 檔案的末尾,ID3V2 就只好記錄在 MP3 檔案的首部了。 每個 ID3V2.3 的標籤都一個標籤頭和若干個標籤幀或一個擴充套件標籤頭組成。歌曲的資訊如標題、作者等都存放在不同的標籤幀中,擴充套件標籤頭和標籤幀並不是必要的,但每個標籤至少要有一個標籤幀。
1.D3V2標籤頭
一首MP3如果有ID3V2.3的話,那麼ID3V2.3的標籤頭佔用檔案最前面的10個位元組,其資料結構如下:
ID3V2.3標籤頭結構
--------------------------------------------------------------------
名稱 位元組 說明
--------------------------------------------------------------------
Header 3 ID3V2.3識別符號"ID3"的Ascii碼,否則認為沒有ID3V2.3
Ver 1 版本號,=03
Revision 1 副版本號,=00
flag 1 標誌位元組,一般沒意義,=00
Size 4 標籤內容長度,高位在前,不包括標籤頭的10個位元組
---------------------------------------------------------------------
備註:
1、Size:Size的計算公式如下:
使用位與 |:
size = ((Size[0] & 0x7f) << 21) |
((Size[1] & 0x7f) << 14) |
((Size[2]
& 0x7f) << 7) |
(Size[3]
& 0x7f);
或者使用加法+:
size = ((Size[0] & 0x7f) << 21) +
((Size[1] & 0x7f) << 14)+
((Size[2] & 0x7f) << 7)+
(Size[3] & 0x7f);
標籤幀的結構
----------------------------------------------------------
名稱 位元組 說明
----------------------------------------------------------
FrameID 4 幀識別符號的Ascii碼,常用識別符號的意義見下表
Size 4 幀內容及編碼方式的合計長度,高位在前,不包括幀頭的10個位元組
Flags 2 標誌,只使用了6位,一般均=0
幀內容 至少 1 個位元組
----------------------------------------------------------
備註:
1、Size的計算同上。
2、編碼方式一般在幀內容的第一個位元組,可能取值為:
0x00:表示幀內容字元用 ISO-8859-1 編碼;
0x01:表示幀內容字元用 UTF-16LE 編碼;
0x02:表示幀內容字元用 UTF-16BE 編碼;
0x03:表示幀內容字元用 UTF-8 編碼(僅ID3V2.4才支援)
我在轉碼為UTF-8的時候,源編碼格式用GBK代替ISO-8859-1,因為GBK英文部分與ISO-8859-1一致,同時是雙位元組編碼,可以用來表示中文簡體和繁體。而ISO-8859-1是單位元組編碼,自身不能顯示中文。
另外編碼方式為0x00時,轉碼後打印不出來資訊(因為幀內容開頭第一位元組就是0x00),一般在判斷編碼格式之後去掉這一個位元組,剩下的內容即可打印出來。
3、有時看到的是"eng"這樣的字元形式,它表示幀內容所使用的自然語言為英語。
標籤幀識別符號的意義(FrameID)
---------------------------------------
名稱 意義
---------------------------------------
AENC: 音訊加密技術
APIC: 附加描述
COMM: 註釋,相當於ID3v1的Comment
COMR: 廣告
ENCR: 加密方法註冊
ETC0: 事件時間編碼
GEOB: 常規壓縮物件
GRID: 組識別註冊
IPLS: 複雜類別列表
MCDI: 音樂CD識別符號
MLLT: MPEG位置查詢表格
OWNE: 所有權
PRIV: 私有
PCNT: 播放計數
POPM: 普通儀表
POSS: 位置同步
RBUF: 推薦緩衝區大小
RVAD: 音量調節器
RVRB: 混響
SYLT: 同步歌詞或文字
SYTC: 同步節拍編碼
TALB: 專輯,相當於ID3v1的Album
TBPM: 每分鐘節拍數
TCOM: 作曲家
TCON: 流派(風格),相當於ID3V1的Genre
TCOP: 版權
TDAT: 日期
TDLY: 播放列表返錄
TENC: 編碼
TEXT: 歌詞作者
TFLT: 檔案型別
TIME: 時間
TIT1: 內容組描述
TIT2: 標題,相當於ID3v1的Title
TIT3: 副標題
TKEY: 最初關鍵字
TLAN: 語言
TLEN: 長度
TMED: 媒體型別
TOAL: 原唱片集
TOFN: 原檔名
TOLY: 原歌詞作者
TOPE: 原藝術家
TORY: 最初發行年份
TOWM: 檔案所有者(許可證者)
TPE1: 藝術家相當於ID3v1的Artist
TPE2: 樂隊
TPE3: 指揮者
TPE4: 翻譯(記錄員、修改員)
TPOS: 作品集部分
TPUB: 發行人
TRCK: 音軌(曲號),相當於ID3v1的Track
TRDA: 錄製日期
TRSN: Intenet電臺名稱
TRSO: Intenet電臺所有者
TSIZ: 大小
TSRC: ISRC(國際的標準記錄程式碼)
TSSE: 編碼使用的軟體(硬體設定)
TYER: 年代,相當於ID3v1的Year
TXXX: 年度
UFID: 唯一的檔案識別符號
USER: 使用條款
USLT: 歌詞
WCOM: 廣告資訊
WCOP: 版權資訊
WOAF: 官方音訊檔案網頁
WOAR: 官方藝術家網頁
WOAS: 官方音訊原始資料網頁
WORS: 官方網際網路無線配置首頁
WPAY: 付款
WPUB: 出版商官方網頁
WXXX: 使用者定義的URL連結
---------------------------------------
說明:
①幀內容是數字的,都用 Ascii 字元表示。
②有的 TCON(風格、流派)的幀內容是直接用字串表示的,如“genre”,而有的則是用編號表示的,如“28 31 32 29”就是用字串“(12)”表示 12 號風格,我們在解析的時候要注意。
③TRCK(音軌)的幀內容格式是:N/M。其中,分母表示專輯中共有 M 首歌曲,分子表示專輯中的第 N 首曲。