【问题标题】:correct coding of ID3 v2.3 frame size field for GEOB tagGEOB 标签的 ID3 v2.3 帧大小字段的正确编码
【发布时间】:2012-12-19 08:49:44
【问题描述】:

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

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

【问题讨论】:

    标签: mp3 id3v2


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是的。但是,鉴于%(二进制)和$(十六进制)的约定,我认为这些文档已经足够明确了:

      总结:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2011-08-31
        • 2017-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        相关资源
        最近更新 更多