Jak porównać dane audio mp3, flac w pliku, ignorując dane nagłówka (tag ID3) itp.?

16

Utworzyłem kopię zapasową niektórych plików audio w dwóch miejscach i dodałem znaczniki ID3 do jednej kopii zapasowej, ale nie w drugiej, ponieważ od czasu moja pamięć zanikła, czy kopie zapasowe są w rzeczywistości takie same, ale teraz jedno ma dane ID3 i inne nie, podstawowe porównanie binarne zakończy się niepowodzeniem, a kontrola będzie uciążliwa.

Czy istnieje narzędzie do porównywania tylko danych audio (nie nagłówka, ID3) w plikach mp3, plikach flac i innych plikach wykorzystujących dane nagłówka, takie jak ID3.

rozpoczął wątek na ponad porównaj tutaj: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

rozważy inne oprogramowanie porównawcze, które wykonuje to zadanie

therobyouknow
źródło

Odpowiedzi:

8

Ach, wieczna niedola. Sam tak długo zmagałem się z tym pytaniem i wypróbowałem tak wiele aplikacji do znajdowania duplikatów plików, że ostatecznie zrezygnowałem i postanowiłem napisać jedną z nich. A potem znalazłem AllDup .

AllDup sprawił, że w nieskończoność wypaliłem swój własny projekt, ponieważ jest to szybki DFF, który ma możliwość porównywania plików MP3 i JPEG, ignorując odpowiednio ich tagi ID3 i dane Exif. Co więcej, Michael Thummerer bardzo szybko reaguje na opinie i szybko naprawia błędy i implementuje sugestie (możesz sugerować ignorowanie nagłówków FLAC). Podsumowując, AllDup jest bezpłatny.

Synetech
źródło
6

Oto sposób na zrobienie tego w powłoce. Potrzebujesz avconv, który jest w Debian / Ubuntu libav-tools.

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

Otrzymasz taką linię:

CRC=0xabfdfe10

Spowoduje to porównanie każdej klatki danych audio i wygenerowanie dla niej CRC. Takie polecenie może porównać wiele plików:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done
blujay
źródło
Niezbyt szybko, ale działa idealnie, aby mieć unikalną sumę kontrolną w plikach mp3 do sprawdzania duplikatów. Dziękuję Ci.
fred727
Szybszą alternatywą, jeśli możesz użyć php, jest biblioteka getid3
fred727
3
@ fred727 Sprawdziłem avconvstronę podręcznika i zdałem sobie sprawę, że crcopcja dekoduje dźwięk i oblicza CRC zdekodowanego dźwięku. Można tego jednak uniknąć, ustawiając kodek audio na copy. Teraz w moim systemie polecenie działa w 0,13 sekundy zamiast 1,13 sekundy. Zaktualizowałem odpowiedź, więc teraz możesz uniknąć używania PHP. :)
blujay,
2

Zrobi to Foobar2000 z wtyczką Binary Comparator .

afrazier
źródło
1
+1 Foobar2000 wygląda FANTASTYCZNIE. Dlaczego? Ponieważ używa właściwych natywnych interfejsów użytkownika systemu Windows, wygląda ładnie, jest lekki i minimalistyczny jak VNC, ale jest bogaty w funkcje i faktycznie zapewnia informacje i funkcje, których się naprawdę chce - na przykład długość utworu itp. Windows Media Player i WinAmp nie pokazują tych informacji i zamiast tego są wyraźnie widoczne niejasne funkcje, których rzadko się używa. Komparator binarny to świetna funkcja dla pytania, które zadaję. Dzięki.
therobyouknow
Cieszę się ze to lubisz!
afrazier
2

Jako możliwe rozwiązanie można użyć dowolnego narzędzia do konwersji pliku na nieskompresowany strumień ( pcm, wav) bez informacji o metadanych, a następnie porównania. Do konwersji można użyć dowolnego oprogramowania masz jak ffmpeg, soxlub avidemux.

Na przykład, jak to robię z ffmpeg

Powiedzmy, że mam dla tego przykładu 2 pliki z różnymi metadanymi: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ Brute force porównanie skarży się, że są one różne.

Następnie konwertujemy i różnicujemy ciało: $ 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 $?Część oczywiście jest tylko w celach demonstracyjnych, aby zobaczyć kod powrotu.

Przetwarzanie wielu plików (katalogów poprzecznych)

Jeśli chcesz spróbować duplikaty w kolekcji mieć wartość do obliczenia sum kontrolnych (każdy jak crc, md5, sha2, sha256) danych, a następnie po prostu znaleźć tam kolizje.

Chociaż nie mieści się w zakresie tego pytania, sugerowałbym kilka prostych sugestii, jak znaleźć duplikaty plików w katalogu rozliczającym tylko zawartość bez uwzględnienia metadanych.

  1. Najpierw oblicz sumę danych w każdym pliku (i umieść w pliku do następnego przetwarzania): 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 Plik będzie wyglądał tak: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Każdy RDBMS będzie tam bardzo pomocny do agregacji liczby i wybrania takich danych. Ale kontynuuj czyste rozwiązanie wiersza polecenia, możesz wykonać proste kroki, takie jak dalsze.

Zobacz duplikaty skrótów, jeśli takie istnieją (dodatkowy krok, aby pokazać, jak to działa, nie jest potrzebny do znajdowania duplikatów): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Wszystko razem, aby wyświetlić listę plików powielonych przez treść : $ 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 to prosty awkskrypt do liczenia wzorców wyrażeń regularnych .

Hubbitus
źródło
1
+1 dzięki Hubbitus - fajne, samodzielne rozwiązanie oparte na open source. Dobrze wiedzieć. Przydatny również do wkładania do partii.
therobyouknow
1

Zadałem to również na forum Beyond Compare, jak wspomniano w pytaniu - a Beyond Compare zapewnia również rozwiązanie:

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

Oba podejścia warto rozważyć:

  • rozwiązanie AllDup jest najlepsze, jeśli nie obchodzi Cię, które kopie plików zostaną zachowane, a które zostaną odrzucone w drzewie folderów ORAZ masz mieszankę oznaczonych i nieoznaczonych plików w tych samych folderach, w których chcesz uruchomić zduplikowane sprawdzenie.

  • Opcja Beyond Compare jest najlepsza, jeśli chcesz zachować drzewo diectory / folder ORAZ porównać 2 oddzielne struktury folderów / katalogów, co pomaga również przy użyciu nieniszczącej opcji spłaszczania drzewa w locie

therobyouknow
źródło