4

我喜欢能够以编程方式比较 mp3。我不知道是什么问题。标题?直方图?渠道?有没有人有这方面的经验?

4

9 回答 9

19

我写了关于音频指纹识别的硕士论文。论文列出了一些开源解决方案来比较音乐听起来像什么的问题,并提供了它们之间的性能比较。可能有点矫枉过正,但是那里有一些非常不错的应用程序。

如果您只想通过标记数据进行比较,则要查看的标准是ID3。基本上有两个版本,第一个非常简单(ID3v1),由一个 MP3 末尾的 128 字节块组成。ID3v2 在 MP3 的开头放置了一个更大的、可变大小的块。

于 2009-02-15T15:10:43.760 回答
6

我喜欢能够以编程方式比较 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 上以提高速度。

蛮力,但它有效。

于 2013-08-27T15:03:40.747 回答
4

我想您可以采取多种方法来解决此问题:

1.比较标签

您可以比较 mp3 标签中保存的数据。标签以ID3格式保存。有许多库可以帮助您访问标签,tagLib是一种流行的选择(TagLib Sharp for .net 应用程序)

2.声学指纹

这是迄今为止最强大的方法,无论压缩甚至格式如何,您都可以找到匹配项。从文件中的实际音频创建一个独特的指纹,允许识别歌曲echoprint是一个开源示例。

3. 从文件创建哈希

这是一种更快的方法,可让您找到内容完全匹配的文件。


一些进一步的阅读:

  • 这里有一篇关于管理 mp3 集合(包括阅读标签)的有趣 MSDN 文章: 链接文本(它在 Visual Basic 中,但可能仍然有用。)

  • 这里有一点文件格式的说明: link text

于 2009-02-15T14:43:27.633 回答
3

比较是什么意思?元数据(作者、标题等)、音频数据?出于什么目的 ?

比较音频数据的流行和基本方法是在某些频谱特征上计算某种距离,例如 MFCC:

http://en.wikipedia.org/wiki/Mel_frequency_cepstral_coefficient

于 2009-02-15T14:46:48.030 回答
2

为了更好地回答您的问题,我认为我们需要确切地知道您要做什么。

如果您想比较实际的歌曲,musicDNS 有一个能够创建音频指纹的库。可以在此处找到名为 libOFA 的库。例如,musicbrainz 使用该指纹识别系统将数字音频文件与他们的数据库进行匹配。理论上,您可以使用它来比较两个不同的数字文件。

如果您正在寻找比较标签数据(id3v1/id3v2),有很多库可以为您做到这一点,提到了 taglib,libmpg123 也有自己的函数来提取标签数据。

libOFA 方法的好处是您可以相互比较不同的格式,因为指纹是在音频本身上完成的。

于 2009-07-22T11:40:50.530 回答
0

看起来Chromaprint 可以满足您的需求。它将 PCM 数据转换为音频指纹,然后您可以使用这些数据进行比较。

他们有一个 C API 库(不过它实际上是用 C++ 编写的)、一个 python 前端,以及一些用于将结果转换为 JSON 的实用程序,这意味着您可以使用另一种语言来操作数据。不过,我认为它们本身并不提供比较功能。

此外,如果您使用的是 Linux 系统,您很可能会找到它的软件包。

于 2019-05-28T22:49:16.367 回答
0

我写了一个 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 标记的文件。虽然我是移动,而不是删除,所以仍然有旧文件。

于 2022-02-03T14:34:50.110 回答
-1

我经常在 linux 上使用 fdupes 来定位重复文件。fdupes 使用 md5 校验和。

于 2009-02-15T15:02:27.650 回答
-1

如果您只是想根据标签比较 mp3,我建议您使用taglib

于 2009-02-15T16:27:58.537 回答