close

這裡的所提的ID3v2,以ID3v2.3為主。

ID3v1的缺點就是一些訊息,例如:Title,Artist都是佔固定的Byte數(30),因此超過30 Bytes的名稱就會被切掉一些字元(因為無法存)。因此後來有了ID3v2,而前者並非ID3v1的

延伸。ID3v1和ID3v2差異最大就是前者是寫在mp3檔的檔尾,且長度固定。而後者長度為變動的,且是從mp3檔案的開頭開始寫起,ID3v2最大可到256 MB。

ID3v2結構分為:

|-------------------------|

|Header (10 Bytes)|

|-------------------------|

|Extended Header    |

|-------------------------|

|Frames(10 Bytes) |

|-------------------------|

|Padding                  |

|------------------------|

|Footer                    |

|------------------------|

主要訊息存放在 HeaderFrame。ID3v2的Header佔10 Bytes,分別為ID3(3 Bytes),Version(2 Bytes),Flags(1 Byte),Size(4 Bytes)。其中Version第一個Byte

為Major version(如果為ID3v2.3,則major version為3),第2個Byte為Revision number。Flag佔1 Byte,最後Size佔4 Bytes,表示整個mp3 tag的大小。

多媒體播放器讀取檔案開頭前3 Bytes為"ID3",表示該mp3檔tag是遵照ID3v2的規範寫入。這裡特別提一下Tag Size的算法較特別,佔4 Bytes,但每一個Byte最高位均為0。

例如: 00 01 02 06 (hex) = 0000 0001 0010 0110 (binary), 紅色Bit 均為0,因此整個Tag Size為第3個Bytes 左移21 bit+第2個

Bytes左移14 bit+第1個Byte 左移7 bit+第0個Byte。簡單表示:Tag Size為 0000 >> 21 + 0001 >> 14 + 0010 >> 7 + 0110。 

 

Tag Size包含ID3v2 Header 和 Frame,而Frame又包含Frame Header 和 Body。ID3v2有非常多的Frame,且順序不固定。有的Frame不會被寫入訊息,因此讀出來的內容會是空的。

 

以ID3v2來說,mp3主要訊息都存在Frame。例如TIT2 Frame存放Title/songname/content description,所以如果要讀出mp3歌曲名稱,需讀出TIT2裡的內容。

 接著來談一下ID3v2 Frame的格式:和ID3v2的Header相同,每個Frame均佔10 Bytes,分別為:Frame ID(4 Bytes),Size(4 Bytes),Flags(2 Bytes)。

 

Frame ID顧名思義為Frame的名稱。例如讀到TIT2這個Frame,則Frame ID為TIT2。Size為該Frame內容所佔大小,不包含Frame本身的10 Bytes,換句話說是從Flags後面開始算起。如果Size為23,則表示從Flags後面的23 Bytes均為該Frame內容所佔大小(註1)。Flag表示該Frame內容所採用的編碼型態,分別為以下四種:(註1)

0000 0000代表使用ISO-8859-1編碼方式。

0000 0001代表使用UTF-16編碼方式。

0000 0002代表使用 UTF-16BE編碼方式。

0000 0003代表使用UTF-8編碼方式。

 

 

程式部分等待整理後再補上,以上會為google和id3.org所認知的ID3v2,有可能有些微錯誤,歡迎提出糾正。

 

 

 

 

 

 

 (註1)

 

 

 

(註1)

 

arrow
arrow
    全站熱搜

    deh3215 發表在 痞客邦 留言(1) 人氣()