我知道MP3文件格式基本上由两个部分组成,id3 metadata+audio frames。如何以二进制形式读取所有id3段和所有音频帧作为两个二进制blob?我希望简单地对作为文件中两个独立单元的元数据和音频执行散列计算。如何确定“拆分点”在文件中的位置?
发布于 2011-05-07 03:34:14
在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
发布于 2020-01-28 02:59:03
通常有零个、一个或两个元数据块。
在文件的开头可能有一个可选的ID3版本2元数据块,它有三个子版本。此ID3v2始终具有可变长度,该长度编码在报头中,但根据subversion的不同,其编码方式略有不同。
然后你就有了音频帧。它们的数量是可变的。没有标头告诉将有多少或它们在文件中的结束位置。
则在文件的末尾可能有可选的ID3版本1元数据块,其具有128字节的固定长度并且以3字节的魔术字开始。
ID3v2标签很少出现在文件的末尾甚至中间。
此外,也有一些罕见的扩展,可能会添加额外的东西到ID3v1标签,使其更长。
您可以遍历MP3文件中的所有“框架”。每个帧以三个字节开始,可用来判断该帧是ID3v2“标签”、MP3音频帧还是ID3v1标签。
请注意,错误或损坏在音频帧中并不罕见。这些帧以0xFFFFFF开始,称为"synch“模式,您必须使用帧中的其他字节和位来执行健全性检查并计算帧的长度。
当帧不是以同步模式、ID3标记魔术字或未通过健全性检查开始时,您应该忽略字节,直到找到下一个0xFFFFFF同步模式。
因此,您可以选择一些快捷方式,这些快捷方式在大多数情况下都可以工作,或者遍历整个文件,这可能会很慢。另外,我并不是真正的专家,所以我可能会因为无知而遗漏了一些东西。特别是,我认为虽然有一些机制可以确保元数据中没有错误的同步模式,但我相信有时它们仍然会发生。
希望这对任何通过谷歌来这里的新人有帮助(-:
https://stackoverflow.com/questions/5916095
复制相似问题