据我所知,MP3文件格式基本上由两个部分组成,即id3元数据+音频帧。如何以二进制形式读取所有id3段和所有音频帧作为两个二进制blob?我希望简单地对元数据和音频执行哈希计算,作为文件中的两个独立单元。如何确定文件中“分割点”的位置?
答案 0 :(得分:4)
来自ID3标签规范:
+-----------------------------+
| Header (10 bytes) |
+-----------------------------+
| Extended Header |
| (variable length, OPTIONAL) |
+-----------------------------+
| Frames (variable length) |
+-----------------------------+
| Padding |
| (variable length, OPTIONAL) |
+-----------------------------+
| Footer (10 bytes, OPTIONAL) |
+-----------------------------+
请注意,有几个ID3标签版本。
答案 1 :(得分:1)
通常有零,一或两个元数据块。
在文件的开头,可能有一个可选的ID3版本2元数据块,它分为三个子版本。此ID3v2始终具有可变长度,该长度在标头中进行了编码,尽管其编码因子版本而略有不同。
然后您将获得音频帧。它们的数量是可变的。没有标头说明有多少个文件或它们在文件中的结尾。
然后在文件末尾可能会有一个可选的ID3版本1 metadta块,该块的固定长度为128字节,以3字节的魔术字开头。
通常,ID3v2标签可能位于文件末尾,甚至位于文件中间。
还有一些罕见的扩展,它们可能会在ID3v1标签中添加更多内容,从而使它变长。
您可以遍历MP3文件中的所有“帧”。每个帧都以三个字节开头,可用于区分该帧是ID3v2“标签”,MP3音频帧还是ID3v1标签。
请注意,错误或损坏在音频帧中并不罕见。这些帧以0xFFFFFF开头(称为“同步”模式),您必须使用帧中的其他字节和位进行完整性检查并计算帧的长度。
当帧不是以同步模式,ID3标签魔术字开头或没有通过完整性检查时,应该忽略字节,直到找到下一个0xFFFFFF同步模式。
因此,您可以采用一些快捷方式,这些快捷方式大多数时候都可以使用,或者遍历整个文件,这可能会很慢。而且我并不是真正的专家,所以可能由于无知而遗漏了一些东西。特别是,我认为尽管有一些机制可以确保在元数据中没有嵌入错误的同步模式,但我相信有时它们仍然会发生。
希望这对通过Google(-: