Comment comparer les données audio mp3, flac dans un fichier, ignorer les données d'en-tête (étiquette ID3), etc.?

J'ai sauvegardé certains fichiers audio en 2 endroits et j'ai ajouté des balises ID3 dans une seule sauvegarde, mais pas l'autre, car l'heure est passée, ma propre mémoire s'est effacée pour savoir si les sauvegardes sont en fait les mêmes, mais maintenant l'une a les données ID3 et la Autrement, la comparaison binaire de base échouera et l'inspection sera lourde.

Existe-t-il un outil pour comparer uniquement les données audio (pas l'en-tête, ID3) dans les fichiers mp3, flac et autres fichiers à l'aide de données d'en-tête telles que ID3.

A commencé un thread sur la comparaison ici: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

Envisager d'autres logiciels de comparaison qui effectuent cette tâche

Ah, la situation éternelle. Moi-même j'ai lutté avec cette question depuis si longtemps et j'ai essayé tant d'applications de recherche de fichiers en double que j'ai finalement abandonné et j'ai décidé d'en écrire un. Et puis j'ai trouvé AllDup .

AllDup m'a fait réinitialiser indéfiniment mon propre projet, car c'est un DFF rapide qui a la capacité de comparer les fichiers MP3 et JPEG, en ignorant respectivement leurs tags ID3 et leurs données Exif. Encore mieux, Michael Thummerer répond très bien aux commentaires et permet de corriger rapidement les bogues et de mettre en œuvre des suggestions (vous pouvez suggérer d'ignorer les en-têtes FLAC). Pour compléter, AllDup est gratuit.

Voici une façon de le faire à la coquille. Vous avez besoin d' avconv , qui dans Debian / Ubuntu est en libav-tools .

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

Vous obtiendrez une ligne comme celle-ci:

 CRC=0xabfdfe10 

Cela permettra de comparer chaque image de données audio et de générer un CRC pour elle. Ainsi, une commande comme celle-ci peut comparer plusieurs fichiers:

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

Foobar2000 avec le plugin Comparateur Binaire fera cela.

J'ai également demandé cela sur le forum Beyond Compare, comme mentionné dans la question – et Beyond Compare fournit également une solution:

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

Les deux approches méritent d'être envisagées:

  • La solution AllDup est préférable si vous ne vous souciez pas des copies des fichiers préservées et rejetées dans un arborescence de répertoires ET vous avez un mélange de fichiers marqués et non étiquetés dans les mêmes dossiers que vous souhaitez exécuter Double vérification.

  • Beyond Compare est le mieux si vous souhaitez conserver l'arbre de diode / dossier et comparez 2 structures de dossiers / répertoires séparés, aidé également en utilisant l'option d'aplatissement non-destructeur à la volée

Comme solution possible, vous pouvez utiliser n'importe quel outil pour convertir le fichier en flux non compressé ( pcm , wav ) sans informations de métadonnées, puis comparez-le. Pour la conversion, vous pouvez utiliser n'importe quel logiciel que vous avez comme ffmpeg , sox ou avidemux .

Par exemple, comment je le fais avec ffmpeg

Dites que j'ai pour cet exemple 2 fichiers avec différentes métadonnées: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ La comparaison de la force brute se plaint qu'ils sont différents.

Ensuite, nous convertions et diff du corps: $ 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 $ 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

Sans cours ; echo $? ; echo $? Partie est juste à des fins de démonstration pour voir le code de retour.

Traitement de fichiers multiples (déplacement des répertoires)

Si vous voulez essayer des doublons en collection, il vous faut calculer les sommes de contrôle (comme crc , md5 , sha2 , sha256 ) de données, puis trouver des collisions.

Bien que ce soit hors de portée de cette question, je suggérerais quelques suggestions simples pour trouver des doublons de fichiers dans la comptabilité d'annuaire uniquement du contenu sans considération de métadonnées.

  1. Tout d'abord, calculer le hash de données dans chaque fichier (et le placer dans le fichier pour le prochain traitement): 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 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 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 fichier sera ressemble à : $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Tout RDBMS sera très utile pour agréger le nombre et sélectionner ces données. Mais continuez la solution de ligne de commande pure, vous voudrez peut-être faire des étapes simples comme d'autres.

Voir duplications hashes si aucune (étape supplémentaire pour montrer comment cela fonctionne, n'est pas nécessaire pour trouver dupes): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Et tous ensemble pour répertorier les fichiers dupliqués par le contenu : $ 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 $ 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 est un script awk simple pour compter les modèles regexp.