如何确定 mp3 文件头的长度?

Posted

技术标签:

【中文标题】如何确定 mp3 文件头的长度?【英文标题】:How can I determine the length of an mp3 file's header? 【发布时间】:2010-02-01 22:24:07 【问题描述】:

我正在编写一个程序来区分,并根据两端的更改复制整个文件或段(Rsync-esque...但更像 Unison)。主要想法是让我的音乐文件夹(所有 mp3)在多个位置保持最新。

如果只有文件的一小部分发生了更改,我想发送分段更新,而不是复制整个文件。为此,我需要一种方法来区分文件的各个部分。

我最初尝试为每个文件的块生成散列(每 n 个字节我对段进行散列)。我注意到,当我更改一个属性(mp3 上的 id3v2 标记)时,所有散列块都会更改。这是有道理的,因为我猜标题会随着获取新信息而增长。

这引出了我的实际问题。我想知道如何确定 mp3 标题的长度,所以我可以创建 2 个可比较的哈希值。

1) 文件的元信息(头)

2) 带有音频的实际 mpeg 流(如果我所做的只是改变标签信息,这个哈希应该保持不变)

我还有什么遗漏吗?

谢谢!

【问题讨论】:

您是否考虑过使用二进制差异实用程序/库? daemonology.net/bsdiff 我最终使用了 TagLibSharp。 developer.novell.com/wiki/index.php/TagLib_Sharp 【参考方案1】:

如果您想确定标头信息,您可以:

a) 需要使用可以为您进行解析的 mp3 库,或者 b) 转到mp3 specification 并根据需要将其解析出来。

【讨论】:

【参考方案2】:

如果您只想检查 id3v2 标签的长度,那么您可以在http://www.id3.org/id3v2.4.0-structure 找到有关其结构的信息。

如果您读取前 3 个字节,并且它们等于“ID3”,则跳到第 7 个字节,然后读取标头大小。不过要小心,因为大小存储为“同步安全整数”。

【讨论】:

【参考方案3】:

我最终使用了 TagLibSharp。 developer.novell.com/wiki/index.php/TagLib_Sharp

【讨论】:

以上是关于如何确定 mp3 文件头的长度?的主要内容,如果未能解决你的问题,请参考以下文章

没有文件头的txt文件,如何判断是啥编码格式

PE文件结构详解

如何确定原始数据包中IP头和TCP头的起始字节

带有文件头的粘贴命令

如何在 Perl 中获取 MP3 文件的长度?

为啥这个操作PE文件头的代码使用了这么奇怪的偏移值?