1

是否有一个 Ruby 库可以让我计算 MP3 文件的音频数据的校验和(减去元数据)或允许我读入 MP3 的音频数据来自己计算校验和?


我正在寻找这样的东西:

mp3 = Mp3Lib::MP3.new('/path/to/song.mp3')
mp3.audio.sha1sum # => the sha1 checksum of _only_ the audio, minus the metadata

我找到了 Mp3Info,但似乎有点乏味。初始化 Mp3Info 对象时,您可以获得实际音频数据开始和结束的帧。

4

2 回答 2

4

自己提取没有元数据的 mp3 文件相当容易。

ID3v1

元数据是文件的最后 128 个字节。如果存在,元数据总是以 3 个字节的“TAG”开头。忽略这最后的 128 字节。

ID3v2

元数据可以存储在文件的开头或结尾。大多数实现只支持开始。ID3v2 有一个存储大小的标头。标头始终位于元数据的开头。有一个可选的页脚,它是元数据末尾页眉的副本。如果元数据位于文件末尾,则需要页脚。

标头具有以下形式

ID3v2/file identifier      "ID3"
ID3v2 version              $04 00
ID3v2 flags                %abcd0000
ID3v2 size             4 * %0xxxxxxx

页脚具有以下形式

ID3v2/file identifier      "3DI"
ID3v2 version              $04 00
ID3v2 flags                %abcd0000
ID3v2 size             4 * %0xxxxxxx

d 位表示页脚是否存在。大小是在没有页眉和页脚的情况下测量的。大小的每个字节总是设置最高位。所以实际的 32 位中只有 28 位代表大小。

只需计算文件的哪一部分不是元数据,然后将其用于您的散列。

请注意,如果 ID3v1 和 ID3v2 都位于文件末尾,则 ID3v1 位于 IDv2 后面

该规范可以在http://www.id3.org/id3v2.4.0-structure找到。

于 2009-12-21T13:38:53.493 回答
1

ID3 标签不是存储在文件末尾 (ID3 v1) 的 128 字节块中,还是存储在文件开头的块中(ID3v2.3 和 v2.4)?( id3.org )

您可以使用audio_contentMp3Info 中的方法,并从文件中读取那么多数据,尽管自己查看文件并找出标题所在的位置可能并不复杂。

于 2009-12-21T13:21:19.133 回答