¿Cómo comparar los datos de audio mp3, flac en un archivo, ignorando los datos del encabezado (etiqueta ID3), etc.?

16

Hice una copia de seguridad de algunos archivos de audio en 2 lugares y agregué etiquetas ID3 en una copia de seguridad, pero no en la otra, ya que el tiempo ha pasado, mi propia memoria se ha desvanecido sobre si las copias de seguridad son realmente las mismas, pero ahora una tiene datos ID3 y otros no, la comparación binaria básica fallará y la inspección será engorrosa.

¿Existe una herramienta para comparar solo los datos de audio (no el encabezado, ID3) en mp3, archivos flac y otros archivos que usan datos de encabezado como ID3.

comenzó un hilo más allá de comparar aquí: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

consideraría otro software de comparación que realiza esta tarea

therobyouknow
fuente

Respuestas:

8

Ah, la situación eterna. Yo mismo luché con esta pregunta durante tanto tiempo y probé tantas aplicaciones de búsqueda de archivos duplicados que finalmente me di por vencido y decidí escribir una. Y luego encontré AllDup .

AllDup me hizo retroceder indefinidamente mi propio proyecto porque es un DFF rápido que tiene la capacidad de comparar archivos MP3 y JPEG, ignorando sus etiquetas ID3 y datos Exif respectivamente. Aún mejor, Michael Thummerer responde muy bien a los comentarios y es rápido para corregir errores e implementar sugerencias (puede sugerir ignorar los encabezados FLAC). Para colmo, AllDup es gratis.

Synetech
fuente
6

Aquí hay una manera de hacerlo en el shell. Necesitas avconv, que en Debian / Ubuntu está adentro libav-tools.

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

Obtendrá una línea como esta:

CRC=0xabfdfe10

Esto comparará cada cuadro de datos de audio y generará un CRC para ello. Entonces, un comando como este puede comparar múltiples archivos:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done
Blujay
fuente
No es muy rápido, pero funciona perfectamente para tener una suma de verificación única en los archivos mp3 para verificar los duplicados. Gracias.
fred727
Una alternativa más rápida si puede usar php es la biblioteca getid3
fred727
3
@ fred727 Revisé la avconvpágina del manual y me di cuenta de que la crcopción decodifica el audio y calcula el CRC del audio decodificado. Pero puede evitar eso configurando el códec de audio en copy. Ahora, en mi sistema, el comando se ejecuta en 0.13 segundos en lugar de 1.13 segundos. Actualicé la respuesta, así que ahora puedes evitar usar PHP. :)
Blujay
2

Foobar2000 con el complemento Binary Comparator hará esto.

afrazier
fuente
1
+1 Foobar2000 se ve FANTÁSTICO. ¿Por qué? Debido a que usa las interfaces de usuario nativas de Windows adecuadas, se ve agradable y liviano y minimalista como VNC, pero rico en funcionalidad y en realidad proporciona información y características que uno realmente quiere, como la duración de la canción, etc. características oscuras que raramente se usarían. Binary Comparator es una gran característica para la pregunta que estoy haciendo. Gracias.
therobyouknow
Me alegro de que te guste!
Afrazier
2

Como posible solución, puede usar cualquier herramienta para convertir archivos en secuencias sin comprimir ( pcm, wav) sin información de metadatos y luego compararlos. Para la conversión, puede usar cualquier software que le guste ffmpeg, soxo avidemux.

Por ejemplo, cómo hago eso con ffmpeg

Digamos que tengo para ese ejemplo 2 archivos con metadatos diferentes: la $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ comparación de fuerza bruta se queja de que son diferentes.

Luego, simplemente convertimos y diferimos cuerpo $ 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

Por supuesto, la ; echo $?parte es solo para fines de demostración para ver el código de retorno.

Procesamiento de múltiples archivos (directorios transversales)

Si quieres probar duplicados en la colección que tiene valor para calcular sumas de comprobación (cualquier parecido crc, md5, sha2, sha256) de los datos y luego simplemente encontrar allí colisiones.

Aunque está fuera del alcance de esa pregunta, sugeriría algunas sugerencias simples sobre cómo encontrar duplicados de archivos en el directorio contando solo su contenido sin consideración de metadatos.

  1. Primero calcule el hash de datos en cada archivo (y colóquelo en el archivo para el siguiente procesamiento): el 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 archivo se verá así: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Cualquier RDBMS será muy útil allí para agregar el recuento y seleccionar dichos datos. Pero continúe con la solución de línea de comandos pura que desee hacer pasos simples como más.

Vea los hashes duplicados, si los hay (paso adicional para mostrar cómo funciona, no es necesario para encontrar engaños): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. Y todo junto para enumerar archivos duplicados por contenido : $ 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 es un awkscript simple para contar patrones regexp.

Hubbitus
fuente
1
+1 agradece Hubbitus, una buena solución autónoma basada en código abierto. Bueno saber. También es útil para poner en un lote.
therobyouknow
1

También pregunté esto en el foro Beyond Compare, como se menciona en la pregunta, y Beyond Compare también proporciona una solución:

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

Vale la pena considerar ambos enfoques:

  • la solución AllDup es mejor si no le importa qué copias de los archivos se conservan y cuáles se descartan en un árbol de carpetas de directorio Y tiene una combinación de archivos etiquetados y no etiquetados en las mismas carpetas en las que desea ejecutar el archivo verificación duplicada

  • Beyond Compare es mejor si desea retener el árbol de carpetas / dietéticas Y compara 2 estructuras de carpetas / directorios separadas, ayudado también mediante el uso de la opción de árbol aplanado no destructivo sobre la marcha

therobyouknow
fuente