通过分析两个MP3文件';字节? 这是用C++或C来做的… 我知道我们可以读取MP3的元数据,但是任何人都可以更改这些信息,不是吗? 那么,有没有一种方法可以分析一个文件的内容,并将其与另一个文件进行比较,从而确定它是否是同一首歌呢
编辑通过分析两个MP3文件';字节? 这是用C++或C来做的… 我知道我们可以读取MP3的元数据,但是任何人都可以更改这些信息,不是吗? 那么,有没有一种方法可以分析一个文件的内容,并将其与另一个文件进行比较,从而确定它是否是同一首歌呢,c++,c,mp3,byte,analysis,C++,C,Mp3,Byte,Analysis,编辑 很多有趣的事情我都没想到。尝试这一点都不是一个好主意。这是可能的,但非常困难 即使是相同的原始记录也可能通过不同的MP3编码器或具有不同设置的相同编码器进行不同的编码。。。当MP3被解码时会导致不同的结果。你需要建立一个听觉模型来“理解”差异有多大,并做出判断 然后是不同录音的问题。如果我唱《曾经在皇家大卫之城》而艾利德·琼斯唱这首歌,那是同一首歌吗?如果一首歌有两个不同的版本,其中一个版本的歌词稍有修改怎么办?琴键可能不同,可能在不同的音域中——各种各样的东西 两首歌有什么不同,但仍然算
很多有趣的事情我都没想到。尝试这一点都不是一个好主意。这是可能的,但非常困难 即使是相同的原始记录也可能通过不同的MP3编码器或具有不同设置的相同编码器进行不同的编码。。。当MP3被解码时会导致不同的结果。你需要建立一个听觉模型来“理解”差异有多大,并做出判断 然后是不同录音的问题。如果我唱《曾经在皇家大卫之城》而艾利德·琼斯唱这首歌,那是同一首歌吗?如果一首歌有两个不同的版本,其中一个版本的歌词稍有修改怎么办?琴键可能不同,可能在不同的音域中——各种各样的东西 两首歌有什么不同,但仍然算是“同一首歌”?一旦决定了这一点,接下来就是实施它的小问题;) 不,没那么简单 您可以检查它们是否包含相同的编码数据,但:
- 可能是不同的比特率
- 可能是同一首歌,只差1/100秒
基本上,如果一个解决方案看起来太简单而不真实,它通常是这样的。如果我真的必须这样做,我的第一次尝试是对两首歌进行傅里叶变换,并比较直方图。您可以使用FFTW(http://www.fftw.org/)进行傅里叶变换,然后将每个频率的差值平方相加,比较直方图。如果结果总和大于某个阈值(您必须通过实验确定),则认为歌曲不同,否则它们是相同的。如果您在iTunes意义上的“相同录制”是指“相同歌曲”,则可以比较两个音频文件,但不能对编码文件逐字节进行比较,因为即使对于相同的格式,在编码时也会选择数据速率和压缩等变量 同样,同一记录的每个编码可能包括不同的引入/引出定时、不同的振幅和均衡,并且可能来自不同的原始源(乙烯基、CD、原始母版等)。因此,你需要一种将所有这些变量都考虑在内的比较方法,即使这样,你最终也会得到匹配的“可能性”,而不是最终的匹配 如果你真正的意思是“同一首歌”,即任何艺术家录制的任何作品和歌词都是相同的,那么在大多数情况下,你不可能得到很高的统计相关性,因为音高、节奏、音程、乐器安排都会有很大的不同
在“同一录制”场景中,可以应用相对简单的信号处理和统计技术,在“同一首歌”场景中,需要部署人工智能技术,即使这样,我怀疑结果也会很差。如果要比较源自同一MP3的MP3文件,但是,如果使用不同的元数据标记,那么只需比较实际的音频数据就可以了。由于它源于相同的MP3编码,您应该能够进行逐字节比较。您必须比较所有字节。只需采样几首就足够了,这样就可以得到一个在另一首歌曲中几乎不可能找到的唯一键 如果文件是由不同的编码器生成的,则必须从数据中提取一些“模糊”特征键并比较这些键。很快,我可能会构造一个这样的算法:
- 以标准比特率将音频解码为脉冲编码调制(wave)
- 使用一些动态定位算法找到固定数量的特征起点。例如,找到从波的开始排列的前10个最高波峰,或者简单地在波中均匀分布(动态地固定第一个和最后一个位置是个好主意,因为不同的编码可能不会在完全相同的点开始和结束)。一个改进是在波浪中不太可能重复的位置选择特征点
- 从特征点提取一组一维特征键标量。例如,对于每个特征,对以下n个样本值进行归一化,并计算过零次数、峰均比、平均过零距离、信号能量。目标是提取相对独特的鲁棒特征,即使信号中添加了一些噪声和失真,也仍然具有特征。这显然可以得到几乎无限的改善
- 使用一些精度测量来比较两个文件的提取特征键(f.eks.9/10特征提取必须至少匹配其提取特征键中的4/5的99%)