如何通过其内容存储和搜索mp3

时间:2010-02-08 12:04:46

标签: php mysql file mp3 format

我想存储多个mp3文件并通过提供一部分歌曲来搜索它们,以检测它是哪首歌。

我正在考虑将所有二进制内容存储在mysql中,当我想按内容搜索特定的歌曲时,我会将一些歌曲的中间部分与MySQL中的二进制数据进行匹配。

我的问题是:

  1. 这是通过内容查找歌曲的合理方式吗?
  2. 将歌曲的内容存储在数据库中是否正确,还是应该使用文件系统?

5 个答案:

答案 0 :(得分:3)

这不起作用。 MP3是一种“有损”的格式。这意味着它在编码时不断改变音乐的微妙细微差别,从而在相同歌曲的几乎每个编码上产生完全不同的字节数据。

此外,即使在像WAV这样的未压缩格式中,不同卷上的两个相同记录也会产生不同的字节数据。因此,无法通过比较文件内容的字节值来比较音乐。

二进制比较仅适用于相同MP3 文件的两个完全相同的副本。当您使用相同的设置重新编码相同的MP3文件时,它甚至不再起作用。

比较音乐不是一件小事,有几种方法存在,但据我所知,没有一种方法可用于PHP。

如果幸运的话,存在一种允许某种匹配的Web服务。不过,期待它在某种程度上是商业化的 - 我怀疑我们是否处于可以免费使用这种东西的阶段。

答案 1 :(得分:2)

  

这是按照歌曲内容查找歌曲的正确方法。

只有当你可以确定你作为搜索标准获得的部分实际上是该特定MP3文件的摘录时......这是非常非常不可能的。如果该部分可以来自不同的来源(即同一首歌的不同录音,或者只是不同的压缩MP3),则必须使用audio fingerprinting,这要复杂得多。

  

将歌曲内容存储在数据库或文件存储中通常是否正常?

如果您进行简单的二进制匹配,那么使用数据库是没有意义的。如果你有一个更复杂的索引技术(如音频指纹),那么使用数据库是有意义的。

答案 2 :(得分:1)

正如其他人所指出的那样 - 通过查看文件的二进制内容来比较MP3是行不通的。

我在大学期间用Java写了这样的东西,用于我的最后一年项目。我非常乐意向您发送源代码。它处理的相对相似性 - “歌曲X更像是歌曲Y而不是歌曲Z”,而不是匹配,但它可能是朝着正确方向迈出的一步。

并且,无论你做什么,请不要尝试在PHP中执行此操作。我使用的算法需要我计算(如果我没记错的话 - 我在大约3年前就开始研究了这个)30 30x30矩阵用于它分析的每个MP3。每首歌花了大约30秒来处理我笨重的旧机器上的一组矩阵(我确信我的新PC可以更快地完成工作)。一旦我有n首歌曲的那些矩阵,第二步计算每对歌曲之间的差异,第三步将这些差异减少到m维空间。这3个步骤中的每一步都需要相当大的功率,而且PHP肯定不适合这项工作。

PHP可能适用于什么是前端 - 我最终得到了一个用Ruby on Rails编写的可查询的web应用程序,我在其中有一个简单的后端,它将每首歌曲的坐标存储在m维空间中(我发生了)选择m = 6) - 给定一首特定的歌曲或片段X,然后你就可以在一定的“距离”X内计算歌曲。

NB。我应该指出,我写的所有代码基本上只是其他人编写的库的包装 - 这是奥地利一所大学的一些聪明人 - 这些库有两首歌并生成矩阵 - 我所做的就是计算距离并将许多歌曲的距离映射到m维空间。希望我足够聪明,也做了第一点!

答案 3 :(得分:0)

我不完全明白你要做的是什么,但是如果你要索引一个MP3集合,那么存储散列(足够长度)而不是实际文件可能更好。< / p>

问题在于字节不能让您对文件的内容(即其中的音乐)有所了解。即使您从要比较的字节中剪切元数据(以消除诸如元数据的拼写/大小写的变化之类的噪声),您只能了解有关唯一文件本身的信息。因此,您可以比较两个相同的文件(即完全重复),但是您无法比较任何两个随机文件的相似性。

答案 4 :(得分:0)

要搜索歌曲,您可能希望将其tags编入索引,并专注于一个简单易用的用户界面,以便用户以灵活的方式查找它们。

如上所述,相同的歌曲将根据编码显示不同的内容字节。

然而,一个指向你的方向的想法,我不确定它是多么可行,将索引一些可能唯一识别它的歌曲模式。对于前者所有Johnny Cash的歌曲有什么共同之处?音量,音调,它们的组合?当你获得一部分内容时,你可以从中提取相同的模式并匹配。这将是一个有趣的概念。