2

我知道 MP3 文件格式本质上由两个部分组成,id3 元数据+音频帧。如何以二进制形式读取所有 id3 段和所有音频帧作为两个二进制 blob?我希望将元数据和音频作为文件中的两个独立单元简单地执行哈希计算。如何确定文件中的“分割点”在哪里?

4

2 回答 2

5

来自 ID3 标签规范:

+-----------------------------+
|      Header (10 bytes)      |
+-----------------------------+
|       Extended Header       |
| (variable length, OPTIONAL) |
+-----------------------------+
|   Frames (variable length)  |
+-----------------------------+
|           Padding           |
| (variable length, OPTIONAL) |
+-----------------------------+
| Footer (10 bytes, OPTIONAL) |
+-----------------------------+

请注意,那里有几个 ID3 标签版本。

规范:http ://www.id3.org/id3v2.4.0-structure

于 2011-05-06T19:34:13.870 回答
1

通常有零个、一个或两个元数据块。

在文件的开头可能有一个可选的 ID3 版本 2 元数据块,它有三个子版本。此 ID3v2 始终具有在标头中编码的可变长度,尽管根据颠覆的不同,它的编码略有不同。

然后你有音频帧。它们的数量不定。没有标题告诉它们将有多少或在文件中结束的位置。

然后在文件的末尾可能有一个可选的 ID3 版本 1 元数据块,它具有 128 字节的固定长度,并以 3 字节的魔术字开头。

很少有 ID3v2 标记可能位于文件末尾,甚至位于中间。

还有一些罕见的扩展可能会向 ID3v1 标签添加额外的东西,使其更长。

您可以遍历 MP3 文件中的所有“帧”。每个帧以三个字节开始,可用于判断该帧是 ID3v2“标签”、MP3 音频帧还是 ID3v1 标签。

请注意,错误或损坏在音频帧中并不罕见。这些帧以 0xFFFFFF 开头,称为“同步”模式,您必须使用帧中的其他字节和位来进行完整性检查并计算帧的长度。

当帧不以同步模式、ID3 标记魔术字开头或未通过完整性检查时,您应该忽略字节,直到找到下一个 0xFFFFFF 同步模式。

因此,您可以采用一些在大多数情况下都可以使用的快捷方式,或者遍历整个文件,这可能会很慢。另外,我不是真正的专家,因此由于无知,我可能遗漏了一些东西。特别是,我认为尽管有一些机制可以确保元数据中没有嵌入错误的同步模式,但我相信有时它们仍然会发生。

希望这对通过谷歌来到这里的任何新人有所帮助(-:

于 2020-01-27T18:59:02.697 回答