2

对于 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('Album/Movie/Show title')标签有类似的问题。

我通读了 v2.3 规范,并在 Google 上进行了搜索,但无法找到有关使用 32 位整数作为这些帧的大小元数据的任何信息。然而,不同商业软件中的常见行为似乎建议此类字段应使用 32 位整数作为大小,而不是使用 0x7F 屏蔽的 4 个字节。

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

4

2 回答 2

1

我相信我已经找到了答案。ID3 v2.3,尽管它得到更普遍的支持(相对于 v2.4),但它并没有写得很好的(和非正式的)规范。它的标头大小使用 4 个 0x7F 字节,但帧大小实际上是 32 位整数,只是它们从未被清楚地拼写出来。

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

于 2013-01-07T13:43:56.137 回答
0

是的。%但是,鉴于立即解释的(binary) 和$(hexadecimal)的约定,我认为这些文档足够明确:

概括:

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

ID3v2.4.0 更改§3还列出了从 v2.3.0 开始的大小更改。整个问题来自与 9(或 12)位设置同步的 MPEG 音频(和 AAC)流 - 任何解码器都可能将 ID3 元数据误解为音频数据。

于 2020-10-21T00:21:40.687 回答