这是要在C++或C .... 我知道我们可以读取MP3的元数据,但这些信息可以被任何人改变,不是吗? 那么有没有办法分析一个文件的内容,并将其与另一个文件进行比较,并确定它是否实际上是同一首歌曲?是否可以通过分析文件的字节来查看两个MP3文件是否是同一首歌曲?
编辑 很多有趣的事情出来,我没有想到。尝试这一点根本不是一个好主意。
这是要在C++或C .... 我知道我们可以读取MP3的元数据,但这些信息可以被任何人改变,不是吗? 那么有没有办法分析一个文件的内容,并将其与另一个文件进行比较,并确定它是否实际上是同一首歌曲?是否可以通过分析文件的字节来查看两个MP3文件是否是同一首歌曲?
编辑 很多有趣的事情出来,我没有想到。尝试这一点根本不是一个好主意。
这是可能的,但非常困难。
即使是相同的原始录制文件,不同的MP3编码器或具有不同设置的相同编码器也可能编码不同......导致不同的结果,当MP3为时解码为。你需要制定一个听觉模型来“理解”差异有多大,并做出判断。
然后有不同的录音问题。如果我唱“曾经在皇家大卫城”并且阿莱德琼斯唱过它,那么这些是同一首歌吗?如果歌曲有两种不同的版本,其中一首歌曲有轻微的修改?关键可能不同,它可能在不同的声音范围内 - 各种各样的东西。
两首歌曲有多不同,但仍然算作“同一首歌曲”?一旦你决定了,那么实施它的小问题;)
+1“很难”(这可能是一个现存的研究问题,至少在一般情况下) – 2010-12-19 12:58:54
我会买“托尼小马唱圣诞节的最爱!” – 2010-12-19 13:09:11
不是很简单。
您可以检查它们包含相同的编码数据,但是:
在这两种情况下,字节都不匹配。
基本上,如果一个解决方案看起来太简单而不真实,它通常是。
如果我真的必须这样做,我的第一个尝试是对两首歌曲进行傅里叶变换并比较直方图。您可以使用FFTW(http://www.fftw.org/)进行傅里叶变换,然后通过对每个频率差异的平方求和来比较直方图。如果总和大于某个阈值(必须通过实验确定),那么这些歌曲被认为是不同的,否则它们是相同的。
如果您的意思是“同一首歌曲”的意思是“相同的录音”,则可以比较两个音频文件,但不能逐字节比较编码文件,因为即使是相同的格式存在编码时选择的诸如数据速率和压缩之类的变量。另外,同一录音的每种编码可能包括不同的导入/导出时间,不同的幅度和均衡,并可能来自不同的原始音源(乙烯基,CD,原版主音等)。所以你需要一个把所有这些变量都考虑进去的比较方法,即使这样你最终会得到一个匹配的“可能性”,而不是一个确定的匹配。
如果你真的是指“同一首歌”,即任何具有相同作曲和歌词的艺术家的任何录音,那么在大多数情况下,你不可能获得很高的统计相关性,因为音调,速度,范围,乐器安排会有很大的不同。在“同样的录音”场景中,可以应用相对简单的信号处理和统计技术,在“同一首歌”情景中,需要部署人工智能技术,即使如此,我怀疑结果也不好。
如果您想比较源自同一MP3但不同标记元数据的MP3文件,只需比较实际音频数据即可。由于它起源于相同的MP3编码,因此您应该可以逐字节比较。你将不得不比较所有的字节。只需抽出几个人就可以得到一个统计上几乎不可能在另一首歌中找到的独特密钥。
如果这些文件是由不同的编码器生成的,则必须从数据中提取一些“模糊”功能键并比较这些键。匆忙我可能会构建一个像这样的算法:
特征提取方法的好处是,您可以为所有的mp3文件和单个文件构建一个特征数据库,问问题:还有哪些其他媒体文件具有完全相同或几乎完全相同的特征这个。使用R * - 树或类似工具可以高效地实现特征查找,这可用于为您提供n维特征集之间的快速距离度量。
上述技术本质上是图像搜索算法中使用的变体,如SIFT,它可能是Photosynth和Google Goggles等应用程序的基础。在图像搜索中,对图像进行过滤以获得相对独特的特征(如形状的角)的良好候选点,然后对该特征周围的区域进行归一化处理,以获得特征的归一化颜色,强度,比例和方向。最后,您提取特征并搜索其他图像的特征的n维数据库,并验证其他图像中找到的特征是否与您的搜索图像中的几何图形相同。搜索音频的技术将是相同的,只是比较简单,因为音频是一维的。
使用开源的EchoPrint库创建两个音频文件的签名,并将它们相互比较。
该库非常易于使用,并且具有关于如何创建签名的清晰示例。
你甚至可以查询他们与签名数据库,找到匹配的歌曲的元数据(如标题,艺术家等)。
在考虑这些问题时,您可能会发现http://www.codinghorror.com/blog/2010/09/youtube-vs-fair-use.html是有趣的。 – Brian 2010-12-20 15:22:29