2013-01-04 74 views
2

我對如何針對ID3 v2.3.0對幀大小字節進行編碼/解碼存在一些混淆。根據(非正式)ID3 v2.3.0規範,每幀的大小應編碼爲4個字節,其中每個字節的最高有效位未被使用。要計算尺寸,它會採取下面的公式:GEOB標籤的ID3 v2.3幀大小字段的正確編碼

byte MASK = (byte)0x7F; 

int size = 0; 

for (int = 0; i < 4; i++) { 
    size = size * 128 + (b[i] & MASK); 
} 

但是,當我用我的解析器解析一些MP3文件,相當多的文件有GEOB(普通封裝的對象標記)幀的大小字節編碼爲如果它是一個Big Endian 32位整數。

當我通過使用適當的算法對它們進行重新編碼來修復這些字節後,商業軟件(如Windows 7和Winamp)無法正確顯示後續標籤(在幾個實例中,TIT2恰好在GEOB之後,所以歌曲標題雖然它在文件中,但並未顯示)。

我還發現了MCDI(音樂CD標識符)和TALB('Album/Movie/Show title')標籤的類似問題。

我閱讀了v2.3規範,也是谷歌搜索,但無法找到任何有關使用32位整數作爲這些幀的大小元數據的信息。然而,不同商業軟件中的常見行爲似乎暗示了這樣的字段,32位整數應該用作大小而不是由0x7F屏蔽的4字節。

所以我只是想知道這裏有沒有人在ID3 v2.3上工作過,可以爲我澄清這一點。

回答

1

我相信我找到了答案。儘管ID3 v2.3被支持得比較普遍(相對於v2.4),但沒有寫得很好(非正式)的規範。它的頭大小使用4個0x7F字節,但幀大小實際上是32位整數,只是它們從未明確拼寫出來。

我處理GEOB時通常遇到問題的原因是因爲問題不會突然出現,直到幀大小大於0x7F,並且通常是GEOB。