Określ różnice między plikami MP3

4

Mam 2 stare podobne drzewa katalogów z plikami MP3. Z przyjemnością używam narzędzi takich jak diff i Rsync do identyfikowania i łączenia plików, które są obecne tylko z jednej strony lub są identyczne, pozostało mi kilka plików, które są bitowo różne.

Po uruchomieniu diff nad parą faktycznie różne pliki (z tagiem -a wymuszającym analizę tekstu) tworzy niezrozumiały bełkot. Słuchałem plików z obu stron i oba wydają się grać dobrze (ale przy prawie 10 minutach na utwór, słuchając ich dwa razy, nie zrobiłem wielu)

Podejrzewam, że różnice wynikają z tego, że jakiś gracz w przeszłości „ulepszał” moją kolekcję, bawiąc się tagami ID3, ale nie mogę być tego pewien. Nawet jeśli zidentyfikuję różnice w znacznikach ID3, chciałbym potwierdzić, że żadne problemy związane z promieniowaniem kosmicznym lub kopiowaniem plików nie uszkodziły żadnego z plików.

Jedną z metod, które się pojawiają, jest znajdowanie lokalizacji bajtów różnic i ignorowanie wszystkich zmian w pierwszym ~ 10kb każdego pliku, ale nie wiem jak to zrobić.

Mam w kolejności około stu plików, które różnią się w drzewie katalogów.

znalazłem Jak porównać pliki mp3, flac audio w pliku, ignorując dane nagłówka (tag ID3) itp.? - ale nie mogę uruchomić alldup z powodu bycia tylko Linuksem, a z jego dźwięków i tak częściowo rozwiązałoby moje problemy.

Thingomy
źródło

Odpowiedzi:

1

Bez porównania zgodnie z tematem ?

Beyond Compare 3 nie działa jako aplikacja konsoli w systemie Linux. To   wymaga X-Windows.

WSPIERANE DYSTRYBUCJE LINUX

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
źródło
1

Beyond Compare (wspomniany powyżej) wygląda na świetne rozwiązanie. Nigdy z niego nie korzystałem. Bit o Xwindows oznacza po prostu, że chce działać w gui, a nie w prostej linii poleceń. Jeśli masz zainstalowanego gui, szanse na to, że Xwindows jest już poprawnie zainstalowane w twoim systemie są bardzo dobre.

Kilka pomysłów, jak postępować:

plik cmp -i 10kB plik1

porówna kolejne dwa dowolne pliki w systemie Linux, najpierw pomijając 10kb na każdym pliku. Ma nawet opcję pominięcia różnych liczników bajtów w każdym pliku. Parametr -b wydrukuje różne bajty, ale może to być bardzo długi wynik, więc jeśli go użyjesz, potokuj wyjście do pliku lub do mniej. Musisz zdecydować, ile bajtów chcesz pominąć. Nie znam tej odpowiedzi. Aby skutecznie korzystać z wielu plików, musisz napisać skrypt w bash lub innym języku. Może uruchomienie go jako części polecenia find z opcją exec będzie działać.

W przyszłości, jeśli szukasz duplikatów plików, sprawdź fdupy. To narzędzie zaprojektowane właśnie do tego. Użyłem go, gdy wciąż zastanawiałem się, jak zarządzać zdjęciami na moim komputerze i skończyło się na kilku katalogach z wieloma duplikatami.

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

Ponadto, jeśli spojrzysz na fdupes na wikipedii, istnieje cały zestaw programów do porównywania plików Linuksa wymienionych we wpisie.

Tylko do cholery, spojrzałem na:

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

który określa strukturę tagów id3. „Zaleca”, aby tagi były umieszczane na początku pliku, ale zapewnia także dodatkowe tagi do dodania na końcu pliku, więc jeśli nikt nie użyje tej opcji, w pliku mogą znajdować się metadane, a nie tylko na początku. Pobieżne spojrzenie na specyfikację ujawnia, że ​​informacje tagu id3 mają zmienną długość, więc nie byłoby dokładnej liczby bajtów, która byłaby gwarantowana, aby ją pominąć, ale 10k, jak pierwotnie sugerowano, powinno być znacznie więcej niż wystarczające, aby pominąć początkowe tagi .

Joe
źródło
0

Jako możliwe rozwiązanie możesz użyć dowolnego narzędzia do konwersji pliku do nieskompresowanego strumienia ( pcm, wav ) bez informacji o metadanych, a następnie porównaj. Do konwersji możesz użyć dowolnego oprogramowania, które lubisz ffmpeg, sox lub avidemux.

Na przykład, jak to zrobić 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 Porównanie brutalnej siły narzeka, że ​​są różne.

Następnie konwertujemy i różnicujemy treść: $ 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

Oczywiście ; echo $? część jest tylko dla celów demonstracyjnych, aby zobaczyć kod powrotu.

Przetwarzanie wielu plików (katalogów przechodzących)

Jeśli chcesz wypróbować duplikaty w kolekcji, warto obliczyć sumy kontrolne (podobnie crc, md5, sha2, sha256 ) danych, a następnie znajdź tam kolizje.

  1. Najpierw oblicz dane mieszania 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 Dla ciebie możesz porównać tylko kilka katalogów, np .: 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

Plik będzie wyglądał następująco: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Dowolny system RDBMS będzie tam bardzo pomocny w agregowaniu liczników i wybieraniu takich danych. Ale kontynuuj czyste rozwiązanie wiersza poleceń, możesz robić proste kroki, takie jak dalsze.

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

  1. A wszystko razem, aby wyświetlić listę plików duplikowanych przez zawartość : $ 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 jest proste awk skrypt do liczenia wzorców wyrażeń regularnych.

P.S. Nieznacznie dostosowany wariant https://superuser.com/a/1219353/435801 .

Hubbitus
źródło