2010-07-14 159 views
5

我正试图编写一个Python脚本来搜索使用歌曲数据作为比较基础的重复的mp3/4文件。我的情况涉及许多具有相似文件名称但具有不同ID3标签的mp3/4文件。起初,我尝试循环并使用md5来查找重复的文件(忽略文件名)。当然,这在ID3标签不匹配时不起作用。使用Python访问MP3音乐数据

因此,我正在寻找一种方法来从mp3/4中仅提取音乐数据,以便通过md5运行并找到任何重复项。什么是最好的方式去做这件事?

+0

音乐可能(虽然'相同')会有不同的比特率(除非你能确定一切都是无损的),这将使得一个简单的数据比较无用。所以你需要更先进的(可能是统计)技术。我敢肯定,SO上的某个人能够提供一些指示... – ChristopheD 2010-07-14 21:32:52

+0

好的一点,而不是简单的md5 fft频率分析更合适。但是,音量可能不同。那么我想你会寻找两个fft之间的相关性,并期望高相关性?它确实变得棘手,因为一些歌曲可能包含难以察觉的“前景” - 介绍或演讲。 – 2010-07-14 21:36:02

+0

@Hamish:我想知道他是否想把这些视为不同(例如,某首歌与现场演出录制的某首歌对比)。这真的取决于你如何定义“重复”,我想。这成为一个相当有趣的问题。 :) – Faisal 2010-07-14 21:40:16

回答

4

尝试使用id3-pymutagen到去掉所有的标签(ID3v1和ID3v2,它们都可以在同一个文件上),然后计算结果的MD5。

假设iTunes没有操作超出标签的文件,它们应该是相同的。转码显然会使这种方法失效。

+0

尽管磁盘密集,但使用Mutagen剥离标签的工作非常好。 – 2010-07-29 21:38:42

0

这实际上是非常先进的,模糊逻辑类型的东西你问。

这不是一个答案,但看一看这篇文章讨论:Detect duplicate MP3 files with different bitrates and/or different ID3 tags?(它可能有资格作为一个傻瓜居然...这是Python所特有的。)

+1

完全不同的问题。这些文件是具有不同ID3标签的相同MP3的副本,因为iTunes试图变得更加智能并更新ID3标签。音乐中应该没有二元差异,只有元数据。不过,谢谢你的回答。 = - ] – 2010-07-14 21:49:20

1

使用一些指纹算法。你可能知道MusicBrainz。他们列出了一些指纹算法here。他们现在使用AcoustId,这可能是你应该使用的东西(它很好,而且是免费的)。有能够产生这样的指纹的Chromaprint库。

我写了一个Python module ffmpeg,它通过FFmpeg进行解码,并提供了一个简单的函数来计算AcoustId指纹(使用Chromaprint)。 Here是一个小的演示(它甚至为这首歌查询MusicBrainz)。

应该很容易建立一些工具,使用它找到所有重复项。

如果音频数据完全相同,指纹将完全相同。如果音频数据相似,它将是相似的。请参阅AcoustId homepage了解更多信息,如果您不只是想检查相等性,您如何计算相似性。