Wie vergleiche ich MP3-, FLAC-Audiodaten in einer Datei, ignoriere Header-Daten (ID3-Tag) usw.?

16

Ich habe einige Audiodateien an zwei Stellen gesichert und ID3-Tags zu einem Backup hinzugefügt, aber nicht zu dem anderen. Seitdem ist mein eigener Speicher dahingehend verblasst, ob die Backups tatsächlich gleich sind, aber jetzt hat einer ID3-Daten und das Andernfalls schlägt der grundlegende binäre Vergleich fehl und die Überprüfung ist umständlich.

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

hat einen unvergleichlichen Thread gestartet: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

Ich würde andere Vergleichssoftware in Betracht ziehen, die diese Aufgabe ausführt

wie Sie wissen
quelle

Antworten:

8

Ah, die ewige Notlage. Ich selbst hatte so lange mit dieser Frage zu kämpfen und habe so viele Apps zum Auffinden doppelter Dateien ausprobiert, dass ich schließlich aufgegeben und beschlossen habe, selbst eine zu schreiben. Und dann habe ich AllDup gefunden .

AllDup hat mich dazu gebracht, mein eigenes Projekt auf unbestimmte Zeit zurückzudrängen, da es sich um eine schnelle DFF handelt, die MP3- und JPEG-Dateien vergleichen kann, wobei die ID3-Tags und Exif-Daten ignoriert werden. Noch besser ist, dass Michael Thummerer sehr schnell auf Feedback reagiert und Fehler behebt und Vorschläge umsetzt (Sie können vorschlagen, FLAC-Header zu ignorieren). Um das Ganze abzurunden, ist AllDup kostenlos.

Synetech
quelle
6

Hier ist ein Weg, um es an der Shell zu tun. Du brauchst avconv, was in Debian / Ubuntu drin 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

Dies vergleicht jeden Rahmen von Audiodaten und erzeugt eine CRC dafür. 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
blujay
quelle
Nicht sehr schnell, aber perfekt, um eine eindeutige Prüfsumme für MP3-Dateien zu haben, um Duplikate zu prüfen. Vielen Dank.
Fred727
Eine schnellere Alternative, wenn Sie PHP verwenden können, ist die getid3-Bibliothek: getid3.org/phpBB3/viewtopic.php?f=3&t=1936
fred727
3
@ fred727 Ich habe die Manpage überprüft avconvund festgestellt, dass die crcOption das Audio dekodiert und die CRC des dekodierten Audios berechnet. Sie können dies jedoch vermeiden, indem Sie den Audio-Codec auf einstellen copy. Auf meinem System läuft der Befehl jetzt in 0,13 Sekunden statt in 1,13 Sekunden. Ich habe die Antwort aktualisiert, so dass Sie jetzt die Verwendung von PHP vermeiden können. :)
blujay
2

Foobar2000 mit dem Binary Comparator- Plugin erledigt dies.

afrazier
quelle
1
+1 Foobar2000 sieht fantastisch aus. Warum? Weil es die richtigen nativen Windows-Benutzeroberflächen verwendet, nett und leicht und minimalistisch wie VNC aussieht und dennoch reich an Funktionalität ist und tatsächlich Informationen und Funktionen bietet, die man wirklich möchte - wie die Länge von Songs usw. Windows Media Player und WinAmp zeigen diese Informationen nicht an und setzen sie stattdessen prominent ein obskure Funktionen, die man selten nutzen würde. Binary Comparator ist ein großartiges Feature für die Frage, die ich stelle. Vielen Dank.
Therobyouknow
Froh, dass Sie es mögen!
afrazier
2

Als mögliche Lösung können Sie ein beliebiges Tool verwenden, um Dateien ohne Metadateninformationen in unkomprimierte Streams ( pcm, wav) zu konvertieren und diese dann zu vergleichen. Für die Konvertierung können Sie jede 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-Vergleiche beklagen, dass sie unterschiedlich sind.

Dann konvertieren wir einfach und diff 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 dient der ; echo $?Teil nur zu Demonstrationszwecken, um den Rückkehrcode zu sehen.

Verarbeitung mehrerer Dateien (Verzeichnisse durchlaufen)

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

Obwohl dies nicht möglich ist, würde ich einige einfache Vorschläge vorschlagen, wie Duplikate von Dateien in der Verzeichnisabrechnung ohne Berücksichtigung von Metadaten gefunden werden können.

  1. Berechnen Sie zuerst den Hash der Daten in jeder Datei (und legen Sie diese für die nächste Verarbeitung in die Datei): 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 folgendermaßen 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 ist dort sehr hilfreich, um die Anzahl zu aggregieren und solche Daten auszuwählen. Fahren Sie jedoch mit der reinen Befehlszeilenlösung fort, und führen Sie einfache Schritte wie folgt aus.

Sehen Sie sich ggf. doppelte Hashes an (zusätzlicher Schritt, um zu zeigen, wie es funktioniert, nicht erforderlich, um Dupes zu finden): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Und alles zusammen, um Dateien aufzulisten, die nach Inhalten dupliziert wurden : $ 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.awk ist ein einfaches awkSkript zum Zählen von Regexp-Mustern.

Hubbitus
quelle
1
+1 Danke Hubbitus - eine nette in sich geschlossene Lösung basierend auf Open Source. Gut zu wissen. Auch nützlich für das Einfügen in eine Charge.
Therobyouknow
1

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 erwägenswert:

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

  • Beyond Compare ist am besten geeignet, wenn Sie den Verzeichnisbaum beibehalten UND 2 separate Ordner- / Verzeichnisstrukturen vergleichen möchten. Dies wird auch durch die sofortige, zerstörungsfreie Option Flatten-Tree unterstützt

wie Sie wissen
quelle