我喜欢能够以编程方式比较 mp3。我不知道是什么问题。标题?直方图?渠道?有没有人有这方面的经验?
9 回答
我喜欢能够以编程方式比较 mp3
我有同样的问题。我发现 iTunes 改变了我下载的许多 Amazon MP3,改变了时间/日期戳、文件大小,因此也改变了 MD5 签名。我的备份突然有很多几乎重复的文件。
当我进行 VIM 比较时,我可以看到更改仅限于文件的非常小的部分。即使在近距离放大的情况下,这些文件在 Audacity 中并排看起来都是一样的。
我的解决方案是创建 mp3 的无头 WAV 转储,然后比较每个 WAV 的 MD5 签名。FFMPEG 可以很容易地进行翻译。
ffmpeg -y -i $mp3 $mp3.wav;
md5sum $mp3.wav
我创建了一个以 MD5 为键的哈希,指向原始 MP3 文件规范。将 wav 文件放在 SSD 上以提高速度。
蛮力,但它有效。
我想您可以采取多种方法来解决此问题:
1.比较标签
您可以比较 mp3 标签中保存的数据。标签以ID3格式保存。有许多库可以帮助您访问标签,tagLib是一种流行的选择(TagLib Sharp for .net 应用程序)
2.声学指纹
这是迄今为止最强大的方法,无论压缩甚至格式如何,您都可以找到匹配项。从文件中的实际音频创建一个独特的指纹,允许识别歌曲echoprint是一个开源示例。
3. 从文件创建哈希
这是一种更快的方法,可让您找到内容完全匹配的文件。
一些进一步的阅读:
比较是什么意思?元数据(作者、标题等)、音频数据?出于什么目的 ?
比较音频数据的流行和基本方法是在某些频谱特征上计算某种距离,例如 MFCC:
http://en.wikipedia.org/wiki/Mel_frequency_cepstral_coefficient
为了更好地回答您的问题,我认为我们需要确切地知道您要做什么。
如果您想比较实际的歌曲,musicDNS 有一个能够创建音频指纹的库。可以在此处找到名为 libOFA 的库。例如,musicbrainz 使用该指纹识别系统将数字音频文件与他们的数据库进行匹配。理论上,您可以使用它来比较两个不同的数字文件。
如果您正在寻找比较标签数据(id3v1/id3v2),有很多库可以为您做到这一点,提到了 taglib,libmpg123 也有自己的函数来提取标签数据。
libOFA 方法的好处是您可以相互比较不同的格式,因为指纹是在音频本身上完成的。
看起来Chromaprint 可以满足您的需求。它将 PCM 数据转换为音频指纹,然后您可以使用这些数据进行比较。
他们有一个 C API 库(不过它实际上是用 C++ 编写的)、一个 python 前端,以及一些用于将结果转换为 JSON 的实用程序,这意味着您可以使用另一种语言来操作数据。不过,我认为它们本身并不提供比较功能。
此外,如果您使用的是 Linux 系统,您很可能会找到它的软件包。
我写了一个 php 来比较忽略所有标题、gfx 和其他信息的音频。基本上从文件列表 foreach 作为 $src: /usr/bin/ffmpeg -hide_banner -y -i "$src" -f s16le -acodec pcm_s16le output.raw 2> /dev/null md5 output.raw 文件(记录这个),将其与其他人进行比较。转换后的文件是原始输出音频,除了创建散列之外不使用。我预见到我的脚本的唯一问题是在转换/散列后保留质量较低的文件或保留具有较少 ID3 标记的文件。虽然我是移动,而不是删除,所以仍然有旧文件。
我经常在 linux 上使用 fdupes 来定位重复文件。fdupes 使用 md5 校验和。
如果您只是想根据标签比较 mp3,我建议您使用taglib。