Identificar diferenças entre arquivos MP3

4

Eu tenho duas árvores de diretórios similares antigas com arquivos MP3. Eu estou feliz em usar ferramentas como diff e Rsync para identificar e mesclar os arquivos que estão presentes apenas em um lado, ou são idênticos, eu tenho um monte de arquivos que são bit a bit diferentes.

Ao executar o diff ao longo de um par de arquivos realmente diferentes, (com uma tag -a para forçar a análise de texto), produz-se um jargão incompreensível. Eu escutei arquivos de ambos os lados, e os dois parecem tocar bem (mas em quase 10 minutos por música, ao ouvi-los duas vezes cada, eu não fiz muitos)

Eu suspeito que as diferenças são devidas a algum jogador no passado, "aumentando" minha coleção, mexendo nas tags ID3, mas não posso ter certeza. Mesmo que eu identifique diferenças nas tags ID3, eu gostaria de confirmar que nenhum problema de erro de cópia cósmica ou de arquivos danificou qualquer um dos arquivos.

Um método que ocorre é encontrar os locais de byte das diferenças e ignorar todas as alterações nos primeiros ~ 10kb de cada arquivo, mas não sei como fazer isso.

Eu tenho na ordem de cem ou mais arquivos que diferem na árvore de diretórios.

Eu encontrei Como comparar dados de áudio mp3, flac em um arquivo, ignorando dados de cabeçalho (tag ID3) etc.? - - mas eu não posso rodar sozinho devido a ser apenas Linux, e pelos sons dele, isso resolveria apenas parcialmente meus problemas de qualquer maneira.

    
por Thingomy 16.10.2011 / 18:47

3 respostas

1

Além de comparar de acordo com o tópico ?

Beyond Compare 3 does not run as a console application on Linux. It requires X-Windows.

SUPPORTED LINUX DISTRIBUTIONS

Red Hat Enterprise Linux 4-6

Fedora 4-14

Novell Suse Linux Enterprise Desktop 10

openSUSE 10.3-11.2

Ubuntu 6.06-10.10

Debian 5.04

Mandriva 2010

    
por 16.10.2011 / 21:20
1

Além da comparação (mencionado acima) parece uma ótima solução. Eu nunca usei isso. O bit sobre Xwindows significa apenas que ele quer rodar em um gui, não em linha de comando direta. Se você tem um gui instalado, então as chances de que o Xwindows já esteja instalado corretamente em seu sistema são extremamente boas.

Algumas ideias sobre como proceder:

cmp -i 10kB file1 file2

irá comparar bytewise dois arquivos arbitrários no Linux, primeiro ignorando 10kb em cada arquivo. Ele ainda tem uma opção para ignorar contagens de bytes diferentes em cada arquivo. O parâmetro -b imprime bytes diferentes, mas isso pode ser uma saída muito longa, portanto, se você usá-lo, canalize a saída em um arquivo ou em menos. Você teria que decidir quantos bytes ignorar. Eu não sei essa resposta. Para usá-lo efetivamente em vários arquivos, você teria que escrever um script no bash ou em outro idioma. Talvez executá-lo como parte de um comando de localização com uma opção exec funcionaria.

No futuro, se estiver procurando por arquivos duplicados, confira fdupes. É um utilitário projetado apenas para isso. Eu usei quando eu ainda estava descobrindo como gerenciar fotos no meu computador e acabei com um monte de diretórios com muitos duplicados neles.

link

Além disso, se você procurar por fdupes na wikipedia, há uma grande quantidade de programas de comparação de arquivos do Linux listados na entrada.

Só para o inferno, eu dei uma olhada:

link

que especifica a estrutura das tags id3. Ele "recomenda" que as tags sejam colocadas no início do arquivo, mas também fornece tags adicionais a serem adicionadas no final do arquivo, portanto, a menos que ninguém use essa opção, pode haver meta informações em outro lugar no arquivo, não apenas no começo. Uma olhada superficial na especificação revela que as informações da tag id3 são variáveis em comprimento, então não haveria uma contagem exata de bytes que seria garantida para pular, mas 10k como originalmente sugerido deveria ser muito mais do que suficiente para pular as tags iniciais .

    
por 17.10.2011 / 00:42
0

Como solução possível, você pode usar qualquer ferramenta para converter arquivos em fluxo descompactado ( pcm , wav ) sem informações de metadados e, em seguida, compará-los. Para conversão, você pode usar qualquer software que tenha como ffmpeg , sox ou avidemux .

Por exemplo, como faço isso com o ffmpeg

Digamos que eu tenha para esse exemplo 2 arquivos com metadados diferentes: %código% Comparação de força bruta queixam-se de serem diferentes.

Então nós apenas convertemos e diferenciamos o corpo: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ

Fora curso $ 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 parte é 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 na coleção, valerá a pena calcular as somas de verificação (como ; echo $? , crc , md5 , sha2 ) dos dados e, em seguida, encontrar as colisões.

  1. Primeiro, calcule o hash de dados em cada arquivo (e coloque no arquivo para o próximo processamento): %código% Para o seu caso, você pode comparar apenas vários diretórios, por exemplo: %código%

O arquivo será parecido com: %código% Qualquer RDBMS será muito útil para agregar a contagem e selecionar esses dados. Mas continue a solução de linha de comando pura que você pode querer fazer etapas simples como mais.

Veja hashes de duplicatas, se houver algum (passo extra para mostrar como funciona, não é necessário para encontrar dupes): sha256

  1. E todos juntos para listar arquivos duplicados pelo conteúdo : %código%

count.by.regexp.awk é simples 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 de script para contar padrões de regexp.

P.S. Variante ligeiramente ajustada do link .

    
por 15.06.2017 / 00:46