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

Mp3 GEOB标签ID3 v2.3帧大小字段的正确编码,mp3,id3v2,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); } 字节掩码=(字节)0x7F; int size=0; 对于(int=

对于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);
}
字节掩码=(字节)0x7F;
int size=0;
对于(int=0;i<4;i++){
大小=大小*128+(b[i]和掩码);
}
但是,当我使用解析器解析一些MP3文件时,相当多的文件具有GEOB(通用封装对象标记)帧,其大小字节被编码为一个大端32位整数

在我通过使用适当的算法对这些字节进行重新编码来修复这些字节后,商业软件(如Windows 7和Winamp)无法正确显示后续标记(在一些情况下,TIT2正好位于GEOB之后,因此歌曲的标题没有显示,尽管它在文件中)

我还发现了MCDI(音乐cd标识符)和TALB(“唱片/电影/节目标题”)标签的类似问题

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


因此,我只是想知道是否有人在ID3 v2.3上工作过,并能为我澄清这一点。

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


我在处理GEOB时经常遇到这个问题的原因是,在帧大小大于0x7F之前,这个问题不会出现,而GEOB通常是。但是,我认为DOC是足够明确的,考虑到<>代码> %(二进制)和<代码> $< /代码>(十六进制),这是立即解释的:

  • 标题大小:
    • 4*%0xxxxxxx
      根据
    • 4*%0xxxxxxx
      根据
    • 4*%0xxxxxxx
      根据
  • 大小:
    • $xx xx xx
      根据
    • $xx xx xx
      根据
    • 4*%0xxxxxxx
      根据
总结:

  • 对于ID3v2中的所有3个版本,标题大小的存储方式相同:使用4个字节,但每个字节只有7位有效
  • 仅对于ID3v2.2大小由3个(完整)字节组成
  • 仅对于ID3v2.3大小由4个(完整)字节组成
  • 仅对于ID3v2.4最终存储的大小与头的大小一样:4字节,但只有28位有效
还列出了v2.3.0版中的框架大小更改。整个问题来自MPEG音频(和AAC)流,该流与设置的9(或12)位同步-任何解码器都可能将ID3元数据误解为音频数据