如何比较mp3,文件中的flac音频数据,忽略标头数据(ID3标签)等?


16

我已经在2个位置备份了一些音频文件,并在一个备份中添加了ID3标签,但没有备份另一个,因为时间过去了,关于备份是否实际上相同,我自己的内存已经消失了,但是现在其中一个具有ID3数据,并且否则,基本的二进制比较将失败,并且检查将很麻烦。

是否有工具可以仅比较mp3,flac文件和其他使用标头数据(例如ID3)的文件中的音频数据(而不标头ID3)。

在这里无法比较的地方开始了一个线程:http : //www.scootersoftware.com/vbulletin/showthread.php?t=7413

会考虑执行此任务的其他比较软件

Answers:


8

啊,永恒的困境。我自己在这个问题上苦苦挣扎了很长时间,尝试了很多重复文件查找应用程序,最终我放弃了,决定自己写一个。然后我找到了AllDup

AllDup使我无限期地回溯了我自己的项目,因为它是一种快速的 DFF,能够比较MP3和JPEG文件,而分别忽略它们的ID3标签和Exif数据。更好的是,Michael Thummerer对反馈非常敏感,并且可以快速修复错误和实施建议(您可以建议忽略FLAC标头)。最重要的是,AllDup是免费的。


6

这是在Shell上执行此操作的方法。您需要avconv在Debian / Ubuntu中的libav-tools

$ avconv -i INPUT_FILE -c:a copy -f crc - 2>/dev/null | grep CRC

您会得到这样的一行:

CRC=0xabfdfe10

这将比较音频数据的每个帧并为其生成CRC。这样的命令可以比较多个文件:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done

速度不是很快,但是可以完美地工作以使mp3文件具有唯一的校验和以检查重复项。谢谢。
fred727 '16

如果可以使用php,则更快的替代方法是getid3库:getid3.org/phpBB3/viewtopic.php?f=
&

3
@ fred727我检查了avconv手册页,并意识到该crc选项对音频进行解码并计算解码后音频的CRC。但是您可以通过将音频编解码器设置为来避免这种情况copy。现在,在我的系统上,命令运行时间为0.13秒,而不是1.13秒。我更新了答案,因此现在您可以避免使用PHP。:)
blujay

2

具有Binary Comparator插件的Foobar2000将执行此操作。


1
+1 Foobar2000看起来很棒。为什么?因为它使用正确的Windows本机UI,所以看起来像VNC一样漂亮,轻巧和简约,但功能丰富,并且实际上提供了人们真正想要的信息和功能-如歌曲长度等。Windows Media Player和WinAmp缺少显示此信息,而是放在显眼位置模糊的功能,人们很少使用。二进制比较器对于我要问的问题来说是一个很棒的功能。谢谢。
therobyouknow 2011年

很高兴你喜欢它!
afrazier 2011年

2

作为可能的解决方案,你可以使用任何工具转换文件到未压缩的流(pcmwav)没有元数据信息,然后进行比较。对于转换你可以使用你喜欢的任何软件ffmpegsoxavidemux

例如我如何用ffmpeg做到这一点

举例来说,我有2个具有不同元数据的文件: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ 蛮力比较抱怨它们是不同的。

然后,我们只转换和比较正文: $ diff <( ffmpeg -loglevel 8 -i Original.mp3 -map_metadata -1 -f wav - ) <( ffmpeg -loglevel 8 -i Possible-dup.mp3 -map_metadata -1 -f wav - ) ; echo $? 0

当然,课程的 ; echo $?一部分仅用于演示目的,以查看返回码。

处理多个文件(遍历目录)

如果你想尝试收集重复它有值得计算校验和(任何类似crcmd5sha2sha256)的数据,然后就发现有冲突。

尽管超出了该问题的范围,但我将提出一些简单的建议,即如何在目录中查找文件的重复项,而不考虑元数据,只考虑其内容。

  1. 首先计算每个文件中的数据哈希值(并将其放入文件中以进行下一步处理): for file in *.mp3; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i "$file" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashes 文件将如下所示: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 任何RDBMS都可以在此处汇总计数并选择此类数据。但是,继续使用纯命令行解决方案,您可能想要做一些简单的步骤,如进一步操作。

查看是否有重复的散列(如果有的话,请参阅其他步骤(显示附加步骤以显示其工作原理,无需查找重复): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. 并一起列出按内容重复的文件 $ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).{64}(?!]=1$)' ) | sort 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3

count.by.regexp.awkawk计算regexp模式的简单脚本。


1
+1感谢Hubbitus-一个很好的基于开源的独立解决方案。很高兴知道。批处理也很有用。
therobyouknow

1

正如问题中所述,我也在Beyond Compare论坛上提出了此问题-Beyond Compare确实提供了解决方案:

http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

两种方法都值得考虑:

  • 如果您不关心保留哪些文件副本以及在目录文件夹树中丢弃哪些文件副本,并且在要运行目录的同一文件夹中混合了带标签文件和未带标签文件,则最好使用AllDup解决方案。重复检查。

  • 如果您要保留部门/文件夹树并比较2个单独的文件夹/目录结构,最好使用“超越比较”,这也可以通过使用即时无损扁平树选项来实现

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.