Come confrontare i dati audio mp3, flac in un file, ignorando i dati di intestazione (tag ID3) ecc.?


16

Ho eseguito il backup di alcuni file audio in 2 posizioni e ho aggiunto tag ID3 in un backup ma non nell'altro, poiché il tempo è passato la mia memoria è sbiadita sul fatto che i backup siano effettivamente gli stessi, ma ora uno ha i dati ID3 e il in caso contrario, il confronto binario di base fallirà e l'ispezione sarà ingombrante.

Esiste uno strumento per confrontare solo i dati audio (non l'intestazione, ID3) in mp3, file flac e altri file utilizzando i dati dell'intestazione come ID3.

ha iniziato una discussione oltre il confronto qui: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

prenderebbe in considerazione altri software di confronto che svolgono questo compito

Risposte:


8

Ah, la condizione eterna. Io stesso ho lottato con questa domanda per così tanto tempo e ho provato così tante app per la ricerca di file duplicati che alla fine ho rinunciato e ho deciso di scriverne una da solo. E poi ho trovato AllDup .

AllDup mi ha fatto bruciare indefinitamente il mio progetto perché è un DFF veloce che ha la capacità di confrontare file MP3 e JPEG, ignorando rispettivamente i loro tag ID3 e i dati Exif. Ancora meglio, Michael Thummerer è molto sensibile al feedback ed è veloce nel correggere bug e implementare suggerimenti (puoi suggerire di ignorare le intestazioni FLAC). Per finire, AllDup è gratuito.


6

Ecco un modo per farlo alla shell. È necessario avconv, che in Debian / Ubuntu è in libav-tools.

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

Otterrai una linea come questa:

CRC=0xabfdfe10

Ciò confronterà ogni frame di dati audio e genererà un CRC per esso. Quindi un comando come questo può confrontare più file:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done

Non molto veloce, ma funziona perfettamente per avere un checksum unico sui file mp3 per controllare i duplicati. Grazie.
Fred727

Un'alternativa più veloce se puoi usare php è la libreria getid3
fred727

3
@ fred727 Ho controllato la avconvpagina man e mi sono reso conto che l' crcopzione decodifica l'audio e calcola il CRC dell'audio decodificato. Ma puoi evitarlo impostando il codec audio su copy. Ora, sul mio sistema, il comando viene eseguito in 0,13 secondi anziché 1,13 secondi. Ho aggiornato la risposta, quindi ora puoi evitare di usare PHP. :)
blujay

2

Foobar2000 con il plugin Comparator binario lo farà.


1
+1 Foobar2000 sembra FANTASTICO. Perché? Perché utilizza le interfacce utente native di Windows, sembra bello, leggero e minimalista come VNC ma ricco di funzionalità e in realtà fornisce informazioni e caratteristiche che si vogliono davvero - come la lunghezza della canzone, ecc. Windows Media Player e WinAmp mancano di mostrare queste informazioni e invece mettono in evidenza caratteristiche oscure che si userebbero raramente. Binary Comparator è un'ottima funzionalità per la domanda che sto ponendo. Grazie.
therobyouknow,

Contento che ti piaccia!
Afrazier,

2

Come possibile soluzione, è possibile utilizzare qualsiasi strumento per convertire il file in flusso non compresso ( pcm, wav) senza informazioni sui metadati e quindi confrontarlo. Per la conversione è possibile utilizzare qualsiasi software che ti piace ffmpeg, soxo avidemux.

Ad esempio come lo faccio con ffmpeg

Supponiamo di avere per esempio 2 file con metadati diversi: il $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ confronto della forza bruta si lamenta che sono diversi.

Quindi convertiamo e 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

La parte fuori rotta ; echo $?è solo a scopo dimostrativo per vedere il codice di ritorno.

Elaborazione di più file (directory trasversali)

Se volete provare duplicati in collezione che hanno la pena di checksum calculate (qualsiasi come crc, md5, sha2, sha256) di dati e poi basta trovare lì le collisioni.

Sebbene non rientri nell'ambito di tale domanda, suggerirei alcuni semplici suggerimenti su come trovare duplicati di file nella contabilità delle directory solo se contenuti, senza considerare i metadati.

  1. Prima calcola l'hash dei dati in ogni file (e inseriscilo nel file per la successiva elaborazione): Il 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 file sarà simile a: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Qualsiasi RDBMS sarà molto utile lì per aggregare il conteggio e selezionare tali dati. Ma continua la pura soluzione da riga di comando che potresti voler fare come semplici passi.

Vedi eventuali hash duplicati (passaggio aggiuntivo per mostrare come funziona, non necessario per trovare duplicati): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. E tutti insieme per elencare i file duplicati dal contenuto : $ 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 è un semplice awkscript per contare i pattern regexp.


1
+1 grazie Hubbitus - una bella soluzione autonoma basata su open-source. Buono a sapersi. Utile anche per l'inserimento in batch.
therobyouknow,

1

Ho anche chiesto questo nel forum Beyond Compare, come menzionato nella domanda, e Beyond Compare fornisce anche una soluzione:

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

Vale la pena considerare entrambi gli approcci:

  • la soluzione AllDup è la migliore se non ti interessa quali copie dei file vengono conservate e quali vengono scartate in un albero di cartelle di directory E hai un mix di file con tag e senza tag nelle stesse cartelle in cui vuoi eseguire il doppio controllo su.

  • Beyond Compare è la soluzione migliore se si desidera mantenere l'albero di diete / cartelle E si confrontano 2 strutture di cartelle / directory separate, aiutate anche utilizzando l'opzione di albero appiattito non distruttivo al volo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.