Wie kann man mp3-, flac-Audiodaten in einer Datei vergleichen, Header-Daten ignorieren (ID3-Tag) usw.?

7902
therobyouknow

Ich habe ein paar Audiodateien an zwei Stellen gesichert und ID3-Tags zu einem Backup hinzugefügt, aber nicht zum anderen, da die Zeit vergangen ist, ist mein eigener Speicher verblasst, ob die Backups tatsächlich gleich sind, aber jetzt hat man ID3-Daten und die Andernfalls schlägt der grundlegende binäre Vergleich fehl und die Überprüfung wird umständlich.

Gibt es ein Werkzeug, um nur die Audiodaten (nicht den Header, ID3) in MP3-Dateien, FLAC-Dateien und anderen Dateien zu vergleichen, die Header-Daten wie ID3 verwenden.

hat hier einen Thread für unübertroffene Vergleiche gestartet: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

würde andere Vergleichssoftware in Betracht ziehen, die diese Aufgabe erfüllt

14

5 Antworten auf die Frage

7
Synetech

Ah, die ewige Notlage. Ich selbst hatte so lange mit dieser Frage zu kämpfen und versuchte so viele Apps, die nach Duplikaten suchten, dass ich schließlich aufgab und beschloss, selbst eine zu schreiben. Und dann habe ich AllDup gefunden .

AllDup hat mich unbestimmt zu einem Back-Burner-Projekt gemacht, weil es ein schneller DFF ist, der MP3- und JPEG-Dateien vergleichen kann und deren ID3-Tags bzw. Exif-Daten ignoriert. Darüber hinaus reagiert Michael Thummerer sehr schnell auf Feedback und kann Fehler schnell beheben und Vorschläge implementieren (FLAC-Header ignorieren). AllDup ist kostenlos.

6
blujay

Hier ist eine Möglichkeit, dies an der Shell zu tun. Du brauchst avconv, was in Debian / Ubuntu ist libav-tools.

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

Sie erhalten eine Zeile wie diese:

CRC=0xabfdfe10 

Dadurch wird jedes Bild der Audiodaten verglichen und ein CRC für dieses erstellt. Ein Befehl wie dieser kann also mehrere Dateien vergleichen:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done 
Nicht sehr schnell, aber perfekt, um eine einzigartige Prüfsumme für MP3-Dateien zu haben, um Duplikate zu prüfen. Vielen Dank. fred727 vor 7 Jahren 0
Eine schnellere Alternative, wenn Sie php verwenden können, ist die getid3-Bibliothek: http://www.getid3.org/phpBB3/viewtopic.php?f=3&t=1936 fred727 vor 7 Jahren 0
@ fred727 Ich habe die Manpage `avconv` überprüft und festgestellt, dass die Option` crc` das Audio decodiert und die CRC des decodierten Audiosignals berechnet. Sie können dies jedoch vermeiden, indem Sie den Audio-Codec auf "Kopieren" setzen. Auf meinem System wird der Befehl jetzt in 0,13 Sekunden statt in 1,13 Sekunden ausgeführt. Ich habe die Antwort aktualisiert, sodass Sie die Verwendung von PHP vermeiden können. :) blujay vor 7 Jahren 3
2
afrazier

Foobar2000 mit dem Binary Comparator Plugin wird dies tun.

+1 Foobar2000 sieht fantastisch aus. Warum? Da es richtige Windows-Benutzeroberflächen verwendet, sieht es nett und leichtgewichtig und minimalistisch wie VNC aus, bietet jedoch reichhaltige Funktionen und bietet tatsächlich Informationen und Funktionen, die man wirklich will - wie Liedlänge * usw. Windows Media Player und WinAmp zeigen diese Informationen nicht an und legen stattdessen Informationen zur Verfügung in prominenten obskuren Funktionen, die man selten verwenden würde. Der binäre Komparator ist eine großartige Funktion für meine Frage. Vielen Dank. therobyouknow vor 13 Jahren 1
Froh, dass Sie es mögen! afrazier vor 13 Jahren 0
1
therobyouknow

Ich habe dies auch im Beyond Compare-Forum gefragt, wie in der Frage erwähnt - und Beyond Compare bietet auch eine Lösung:

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

Beide Ansätze sind eine Überlegung wert:

  • Die AllDup-Lösung ist am besten geeignet, wenn Sie sich nicht darum kümmern, welche Kopien der Dateien erhalten bleiben und welche in einer Verzeichnisordnerstruktur verworfen werden UND Sie eine Mischung aus markierten und nicht markierten Dateien in denselben Ordnern haben, in denen Sie die Dateien ausführen möchten doppelte überprüfung an.

  • Beyond Compare ist am besten, wenn Sie die Diectory- / Ordner-Struktur beibehalten möchten UND 2 separate Ordner- / Verzeichnisstrukturen vergleichen. Dies wird auch durch die sofortige, nicht destruktive Flatten-Tree-Option unterstützt

1
Hubbitus

Als mögliche Lösung können Sie ein beliebiges Werkzeug verwenden, um eine Datei in einen unkomprimierten Stream ( pcm, wav) ohne Metadaten-Informationen zu konvertieren und diese anschließend zu vergleichen. Zur Konvertierung können Sie eine beliebige Software verwenden, die Ihnen gefällt ffmpeg, soxoder avidemux.

Zum Beispiel wie ich das mit ffmpeg mache

Angenommen, ich habe für dieses Beispiel 2 Dateien mit unterschiedlichen Metadaten: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ Brute-Force-Vergleich beschwert sich, dass sie unterschiedlich sind.

Dann konvertieren wir einfach und differ body: $ 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

Natürlich ist der ; echo $?Teil nur zu Demonstrationszwecken, um den Rückkehrcode zu sehen.

Verarbeitung mehrerer Dateien (Querverzeichnisse)

Wenn Sie versuchen wollen Duplikate in der Sammlung haben es sich lohnt Prüfsummen zu berechnen (alle wie crc, md5, sha2, sha256) von Daten und dann einfach da Kollisionen finden.

Obwohl es außerhalb des Rahmens dieser Frage liegt, würde ich einige einfache Vorschläge vorschlagen, wie Duplikate von Dateien in der Verzeichnisabrechnung finden kannst, nur deren Inhalt ohne Berücksichtigung der Metadaten.

  1. Berechnen Sie zuerst den Hashwert der Daten in jeder Datei (und legen Sie ihn für die nächste Verarbeitung in einer Datei ab): Die 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 Datei sieht wie folgt aus: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Jedes RDBMS wird dort sehr hilfreich sein, um die Anzahl zu zählen und diese Daten auszuwählen. Fahren Sie jedoch mit einer reinen Befehlszeilenlösung fort, die Sie möglicherweise mit einfachen Schritten erledigen möchten.

Falls vorhanden, sehen Sie doppelte Hashes (zusätzlicher Schritt, um zu zeigen, wie es funktioniert, wird nicht benötigt, um Dupes zu finden): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Und alle zusammen, um die nach Inhalt duplizierten Dateien aufzulisten : $ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).(?!]=1$)' ) | sort 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3

count.by.regexp.awk ist ein einfaches awkSkript, um reguläre Ausdrücke zu zählen.

+1 Danke Hubbitus - eine schöne, in sich geschlossene Lösung, die auf Open Source basiert. Gut zu wissen. Auch nützlich zum Einlegen in eine Charge. therobyouknow vor 7 Jahren 1