Como comparar mp3, dados de áudio flac em um arquivo, ignorando dados do cabeçalho (etiqueta ID3) etc.?

16

Fiz backup de alguns arquivos de áudio em dois locais e adicionei tags ID3 em um backup, mas não no outro, já que o tempo passou e minha própria memória diminuiu se os backups são realmente os mesmos, mas agora há dados ID3 e o outro não, a comparação binária básica falhará e a inspeção será complicada.

Existe uma ferramenta para comparar apenas os dados de áudio (não o cabeçalho, ID3) em mp3s, arquivos flac e outros arquivos usando dados de cabeçalho, como ID3.

iniciou uma discussão além da comparação aqui: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

consideraria outro software de comparação que executa esta tarefa

therobyouknow
fonte

Respostas:

8

Ah, a situação eterna. Eu mesmo lutei com essa pergunta por tanto tempo e tentei tantos aplicativos de busca de arquivos duplicados que acabei desistindo e decidi escrever um. E então eu encontrei AllDup .

O AllDup me deixou indefinidamente em segundo plano em meu próprio projeto, porque é um DFF rápido que tem a capacidade de comparar arquivos MP3 e JPEG, ignorando suas tags ID3 e dados Exif, respectivamente. Melhor ainda, Michael Thummerer responde muito bem aos comentários e é rápido em corrigir bugs e implementar sugestões (você pode sugerir ignorar os cabeçalhos FLAC). Para completar, o AllDup é gratuito.

Synetech
fonte
6

Aqui está uma maneira de fazer isso no shell. Você precisa avconv, que está no Debian / Ubuntu libav-tools.

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

Você obterá uma linha como esta:

CRC=0xabfdfe10

Isso irá comparar todos os quadros de dados de áudio e gerar um CRC para eles. Portanto, um comando como esse pode comparar vários arquivos:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done
Blujay
fonte
Não é muito rápido, mas funciona perfeitamente para ter uma soma de verificação exclusiva em arquivos mp3 para verificar duplicatas. Obrigado.
Fred727 11/11
Uma alternativa mais rápida se você pode usar php é biblioteca getID3: getid3.org/phpBB3/viewtopic.php?f=3&t=1936
fred727
3
@ fred727 Verifiquei a avconvpágina de manual e percebi que a crcopção decodifica o áudio e calcula o CRC do áudio decodificado. Mas você pode evitar isso configurando o codec de áudio para copy. Agora, no meu sistema, o comando é executado em 0,13 segundos em vez de 1,13 segundos. Atualizei a resposta, agora você pode evitar o uso do PHP. :)
blujay
2

O Foobar2000 com o plug-in Binary Comparator fará isso.

afrazier
fonte
1
+1 Foobar2000 parece FANTÁSTICO. Por quê? Como ele usa interfaces de usuário nativas apropriadas do Windows, parece agradável, leve e minimalista como o VNC, mas rico em funcionalidades e fornece informações e recursos que realmente se deseja - como a duração da música etc. características obscuras que raramente se usaria. O comparador binário é um ótimo recurso para a pergunta que estou fazendo. Obrigado.
Therobyouknow 22/02
Estou feliz por ter gostado!
afrazier
2

Como solução possível, você pode usar qualquer ferramenta para converter arquivos em fluxo não compactado ( pcm, wav) sem informações de metadados e compará-las. Para a conversão, você pode usar qualquer software que desejar ffmpeg, soxou avidemux.

Por exemplo, como faço isso com o ffmpeg

Digamos que eu tenha nesse exemplo 2 arquivos com metadados diferentes: a $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ comparação de força bruta reclama que eles são diferentes.

Então nós apenas convertemos e diferenciamos o corpo: $ 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

A ; echo $?parte fora do curso é apenas para fins de demonstração para ver o código de retorno.

Processando vários arquivos (diretórios transversais)

Se você quiser tentar duplicatas em coleção que tem valor para checksums calcular (qualquer como crc, md5, sha2, sha256) de dados e, em seguida, basta encontrar lá colisões.

Embora esteja fora do escopo dessa pergunta, eu sugeriria algumas sugestões simples de como encontrar duplicatas de arquivos na contabilidade de diretório, apenas o conteúdo sem a consideração de metadados.

  1. Primeiro, calcule o hash de dados em cada arquivo (e coloque-o no arquivo para o próximo processamento): O 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 arquivo será semelhante a: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Qualquer RDBMS será muito útil para agregar a contagem e selecionar esses dados. Mas continue com a solução pura de linha de comando, que você pode querer seguir etapas simples.

Veja hashes duplicados, se houver (etapa extra para mostrar como funciona, não é necessária para encontrar dupes): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. E todos juntos para listar arquivos duplicados pelo conteúdo : $ 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 é um awkscript simples para contar padrões de regexp.

Hubbitus
fonte
1
+1 graças ao Hubbitus - uma boa solução independente baseada em código aberto. Bom saber. Também é útil para colocar em um lote.
therobyouknow
1

Também perguntei isso no fórum Beyond Compare, conforme mencionado na pergunta - e o Beyond Compare também fornece uma solução:

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

Vale a pena considerar as duas abordagens:

  • a solução AllDup é melhor se você não se importa com as cópias dos arquivos que são preservadas e as que são descartadas em uma árvore de pastas de diretório E você tem uma mistura de arquivos com e sem tags nas mesmas pastas em que deseja executar o arquivo. verificação duplicada.

  • Beyond Compare é melhor se você deseja manter a árvore de pastas / diretórios E comparar 2 estruturas de pastas / diretórios separadas, ajudadas também pelo uso da opção não destrutiva de planificação de árvore em tempo real

therobyouknow
fonte