关于如何为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并且可以为我澄清这一点。
答案 0 :(得分:1)
我相信我找到了答案。 ID3 v2.3,尽管它更受支持(而不是v2.4),但还没有写好(和非正式)规范。它的头大小使用4 0x7F字节,但帧大小实际上是32位整数,只是它们从未清楚地拼写出来。
我在处理GEOB时遇到问题的原因是因为问题在帧大小大于0x7F之前不会出现,而GEOB通常是。
答案 1 :(得分:0)
是的。但是,考虑到%
(二进制)和$
(十六进制)的约定,我认为文档足够明确:
4 * %0xxxxxxx
按照v2.2.0 (§3.1.) header 4 * %0xxxxxxx
按照v2.3.0 header 4 * %0xxxxxxx
按照v2.4.0 (§3.1.) header $xx xx xx
按照v2.2.0 (i.e. §4.1.) frame $xx xx xx xx
按照v2.3.0 frame 4 * %0xxxxxxx
按照v2.4.0 (§4.) frame 摘要:
ID3v2.4.0 changes §3还列出了版本2.3.0中的框架大小更改。整个问题来自与9(或12)位集同步的MPEG音频(和AAC)流-然后,任何解码器都可能将ID3元数据误解为音频数据。