2013-01-04 53 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。