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

16

J'ai sauvegardé certains fichiers audio à 2 endroits et ajouté des balises ID3 dans une sauvegarde mais pas dans l'autre, depuis que le temps a passé, ma propre mémoire s'est estompée pour savoir si les sauvegardes sont réellement les mêmes, mais maintenant on a des données ID3 et le d'autres non, 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 fil sur au-delà de comparer ici: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

envisagerait d'autres logiciels de comparaison qui font cette tâche

therobyouknow
la source

Réponses:

8

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

AllDup m'a indéfiniment back-burner mon propre projet car c'est un DFF rapide qui a la capacité de comparer les fichiers MP3 et JPEG, en ignorant leurs balises ID3 et les données Exif respectivement. Encore mieux, Michael Thummerer est très réactif aux commentaires et résout rapidement les bugs et implémente les suggestions (vous pouvez suggérer d'ignorer les en-têtes FLAC). Pour couronner le tout, AllDup est gratuit.

Synetech
la source
6

Voici un moyen de le faire sur le shell. Vous avez besoin de avconvce qui se trouve dans Debian / Ubuntu 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 va comparer chaque trame de données audio et générer un CRC pour cela. Une commande comme celle-ci peut donc comparer plusieurs fichiers:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done
blujay
la source
Pas très rapide, mais fonctionne parfaitement pour avoir une somme de contrôle unique sur les fichiers mp3 pour vérifier les doublons. Je vous remercie.
fred727
Une alternative plus rapide si vous pouvez utiliser php est la bibliothèque getid3
fred727
3
@ fred727 J'ai vérifié la avconvpage de manuel et j'ai réalisé que l' crcoption décode l'audio et calcule le CRC de l'audio décodé. Mais vous pouvez éviter cela en définissant le codec audio sur copy. Maintenant, sur mon système, la commande s'exécute en 0,13 seconde au lieu de 1,13 seconde. J'ai mis à jour la réponse, vous pouvez donc maintenant éviter d'utiliser PHP. :)
blujay
2

Foobar2000 avec le plugin Binary Comparator fera cela.

afrazier
la source
1
+1 Foobar2000 a l'air FANTASTIQUE. Pourquoi? Parce qu'il utilise les interfaces utilisateur natives de Windows appropriées, a l'air agréable et léger et minimaliste comme VNC mais riche en fonctionnalités et fournit en fait des informations et des fonctionnalités que l'on veut vraiment - comme la longueur de la chanson , etc. fonctionnalités obscures que l'on utiliserait rarement. Le comparateur binaire est une excellente fonctionnalité pour la question que je pose. Merci.
therobyouknow
Content que tu aimes ça!
afrazier
2

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

Par exemple, comment je fais ça avec ffmpeg

Disons que j'ai pour cet exemple 2 fichiers avec des métadonnées différentes: $ 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 convertissons et différons simplement le 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

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

Traitement de plusieurs fichiers (répertoires transversaux)

Si vous voulez essayer les doublons dans la collecte , il vaut la peine d'avoir checksums calculate (tout comme crc, md5, sha2, sha256) de données, puis trouver juste là collisions.

Bien qu'il soit hors de portée de cette question, je suggérerais quelques suggestions simples sur la façon de trouver des doublons de fichiers dans le répertoire en tenant compte uniquement de son contenu sans tenir compte des métadonnées.

  1. Calculez d'abord le hachage des données dans chaque fichier (et placez-les dans le fichier pour le prochain traitement): Le 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 ressemblera à: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Tout SGBDR 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 plus loin.

Voir les hachages en double le cas échéant (étape supplémentaire pour montrer comment cela fonctionne, n'est pas nécessaire pour trouver des dupes): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Et tous ensemble pour lister les fichiers dupliqués par 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

count.by.regexp.awk est un awkscript simple pour compter les modèles d'expression régulière .

Hubbitus
la source
1
+1 merci Hubbitus - une belle solution autonome basée sur l'open source. Bon à savoir. Également utile pour mettre en lot.
therobyouknow
1

J'ai également posé cette question sur le forum Beyond Compare, comme mentionné dans la question - et Beyond Compare propose également une solution:

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

Les deux approches méritent réflexion:

  • la solution AllDup est préférable si vous ne vous souciez pas des copies des fichiers qui sont conservées et de celles qui sont rejetées dans une arborescence de répertoires ET que vous avez un mélange de fichiers balisés et non balisés dans les mêmes dossiers que vous souhaitez exécuter vérification en double.

  • Beyond Compare est préférable si vous souhaitez conserver l'arborescence des répertoires / dossiers ET que vous comparez 2 structures de dossiers / répertoires distinctes, aidées également en utilisant l'option d'aplatissement non destructif à la volée

therobyouknow
la source