1. 程式人生 > >linux下使用C獲取mp3 ID3資料時的一些注意事項(v1,v2.3,v2.4)

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 首曲。