正确编码GEOB标签的ID3 v2.3帧大小字段

时间:2013-01-04 21:24:14

标签: mp3 id3v2

关于如何为ID3 v2.3.0编码/解码帧大小字节,我有些困惑。根据(非正式)ID3 v2.3.0规范,每帧的大小应编码为4个字节,其中每个字节的最高有效位未使用。要计算尺寸,需要采用以下公式:

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('专辑/电影/节目标题')标签的类似问题。

我通读了v2.3规范,也读了Googled,但是无法找到有关使用32位整数作为这些帧的大小元数据的任何信息。然而,不同商业软件中的常见行为似乎表明,对于这些字段,应使用32位整数作为大小,而不是使用0x7F屏蔽的4个字节。

所以我只是想知道是否有人在这里工作过ID3 v2.3并且可以为我澄清这一点。

2 个答案:

答案 0 :(得分:1)

我相信我找到了答案。 ID3 v2.3,尽管它更受支持(而不是v2.4),但还没有写好(和非正式)规范。它的头大小使用4 0x7F字节,但帧大小实际上是32位整数,只是它们从未清楚地拼写出来。

我在处理GEOB时遇到问题的原因是因为问题在帧大小大于0x7F之前不会出现,而GEOB通常是。

答案 1 :(得分:0)

是的。但是,考虑到%(二进制)和$(十六进制)的约定,我认为文档足够明确:

摘要:

  • 对于ID3v2中的所有3个版本,标头的大小都以相同的方式存储:使用4个字节,但每个字节只有7位有效。
  • 仅对于ID3v2.2 ,大​​小由3个(完整)字节组成。
  • 仅对于ID3v2.3 ,大​​小由4个(完整)字节组成。
  • 仅对于ID3v2.4 ,最终存储的大小与标头的大小相同:4个字节,但只有28位有效。

ID3v2.4.0 changes §3还列出了版本2.3.0中的框架大小更改。整个问题来自与9(或12)位集同步的MPEG音频(和AAC)流-然后,任何解码器都可能将ID3元数据误解为音频数据。