Unterschiede zwischen MP3-Dateien erkennen

4

Ich habe 2 alte, ähnliche Verzeichnisbäume mit MP3-Dateien darin. Ich benutze gerne Tools wie diff und Rsync, um Dateien zu identifizieren und zusammenzuführen, die nur auf einer Seite vorhanden sind oder identisch sind. Ich habe eine Reihe von Dateien, die sich bitweise unterscheiden.

Beim Ausführen von diff über ein Paar tatsächlich verschiedener Dateien (mit -a-Tag zum Erzwingen der Textanalyse) wird ein unverständlicher Kauderwelsch erzeugt. Ich habe Dateien von beiden Seiten angehört, und beide scheinen gut zu spielen (aber bei fast 10 Minuten pro Song, wenn ich sie jeweils zweimal höre, habe ich nicht viele gemacht).

Ich vermute, die Unterschiede sind darauf zurückzuführen, dass einige Spieler in der Vergangenheit meine Sammlung mit ID3-Tags "verbessert" haben, aber ich bin mir nicht sicher. Selbst wenn ich Unterschiede in den ID3-Tags feststelle, möchte ich bestätigen, dass keine Probleme mit kosmischen Strahlen oder Dateikopierfehlern beschädigt wurden.

Eine Methode, die auftritt, besteht darin, die Bytespeicherorte der Unterschiede zu finden und alle Änderungen in den ersten ~ 10kb jeder Datei zu ignorieren, aber ich weiß nicht, wie das geht.

Ich habe etwa hundert Dateien, die sich im Verzeichnisbaum unterscheiden.

ich fand Wie kann man mp3-, flac-Audiodaten in einer Datei vergleichen, Header-Daten ignorieren (ID3-Tag) usw.? - aber ich kann nicht alldup ausführen, weil ich nur Linux bin und aufgrund der Geräusche würde es meine Probleme sowieso nur teilweise lösen.

Thingomy
quelle

Antworten:

1

Unvergleichlich nach thema ?

Beyond Compare 3 wird unter Linux nicht als Konsolenanwendung ausgeführt. Es   erfordert X-Windows.

UNTERSTÜTZTE LINUX-VERBREITUNGEN

Red Hat Enterprise Linux 4-6

Fedora 4-14

Novell Suse Linux Enterprise Desktop 10

openSUSE 10.3-11.2

Ubuntu 6.06-10.10

Debian 5.04

Mandriva 2010

Lazy Badger
quelle
1

Beyond Compare (siehe oben) scheint eine großartige Lösung zu sein. Ich habe es noch nie benutzt. Das bisschen über Xwindows bedeutet nur, dass es in einer GUI laufen soll, nicht in einer direkten Befehlszeile. Wenn Sie eine GUI installiert haben, sind die Chancen, dass Xwindows bereits ordnungsgemäß auf Ihrem System installiert ist, sehr groß.

Einige Ideen zur weiteren Vorgehensweise:

cmp -i 10kB Datei1 Datei2

vergleicht zwei beliebige Dateien unter Linux und überspringt zunächst 10 KB pro Datei. Es gibt sogar eine Option, um unterschiedliche Byte-Zählungen für jede Datei zu überspringen. Der Parameter -b gibt unterschiedliche Bytes aus. Dies kann jedoch eine sehr lange Ausgabe sein. Wenn Sie sie verwenden, geben Sie die Ausgabe in eine Datei oder in weniger. Sie müssen entscheiden, wie viele Bytes übersprungen werden sollen. Ich kenne diese Antwort nicht. Um es effektiv für mehrere Dateien zu verwenden, müssen Sie ein Skript in bash oder einer anderen Sprache schreiben. Vielleicht würde es funktionieren, es als Teil eines Suchbefehls mit einer exec-Option auszuführen.

Wenn Sie nach doppelten Dateien suchen, checken Sie fdupes aus. Es ist ein Dienstprogramm, das nur dafür entwickelt wurde. Ich habe es benutzt, als ich noch herausgefunden hatte, wie man Fotos auf meinem Computer verwaltet, und es endete mit einer Reihe von Verzeichnissen mit vielen Duplikaten.

https://code.google.com/p/fdupes/

Wenn Sie fdupes auf Wikipedia nachschlagen, gibt es eine ganze Reihe von Linux-Dateivergleichsprogrammen, die im Eintrag aufgelistet sind.

Ich habe mir nur mal angesehen:

http://www.id3.org/id3v2.4.0-structure

was gibt die Struktur von ID3-Tags an. Es "empfiehlt", die Tags am Anfang der Datei zu platzieren, sieht jedoch auch vor, dass am Ende der Datei zusätzliche Tags hinzugefügt werden. Wenn also niemand diese Option verwendet, können sich an einer anderen Stelle in der Datei Metainformationen befinden gleich am anfang. Ein flüchtiger Blick auf die Spezifikation zeigt, dass die ID3-Tag-Informationen variabel in der Länge sind. Es gibt also keine genaue Bytezahl, die garantiert übersprungen würde, aber 10k sollte, wie ursprünglich vorgeschlagen, weitaus mehr als ausreichend sein, um die ursprünglichen Tags zu überspringen .

Joe
quelle
0

Als mögliche Lösung können Sie ein beliebiges Werkzeug verwenden, um eine Datei in einen nicht komprimierten Stream zu konvertieren ( pcm. wav ) ohne Metadaten-Info und dann vergleichen. Zur Konvertierung können Sie beliebige Software verwenden ffmpeg. sox oder 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 beklagt sich, dass sie sich unterscheiden.

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 ; echo $? Teil ist nur zu Demonstrationszwecken, um den Rückkehrcode zu sehen.

Verarbeitung mehrerer Dateien (Querverzeichnisse)

Wenn Sie Duplikate in der Sammlung ausprobieren möchten, müssen Sie die Prüfsummen (ähnlich) berechnen crc. md5. sha2. sha256 ) von Daten und finden dort einfach Kollisionen.

  1. Berechnen Sie zuerst den Datenhash in jeder Datei (und legen Sie ihn für die nächste Verarbeitung in einer Datei ab): 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 Für Ihren Fall können Sie nur mehrere Verzeichnisse vergleichen, z. find -L orig-dir dir-with-duplicates -name '*.mp3' -print0 | while read -r -d $'\0' file; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i \"$file\" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashes

Die 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 Zählung zusammenzufassen und solche Daten auszuwählen. Fahren Sie jedoch mit der 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 Dateien aufzulisten, die nach Inhalt kopiert 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 einfach awk Skript, um reguläre Ausdrücke zu zählen.

P.S. Leicht angepasste Variante von https://superuser.com/a/1219353/435801 .

Hubbitus
quelle