如何确定 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 文件头的长度?的主要内容,如果未能解决你的问题,请参考以下文章