Detectar arquivos mp3 ou ogg truncados

4

Recentemente, tive uma falha no disco rígido e não consegui recuperar todos os meus arquivos de música. Como não tinha armazenamento suficiente disponível para fazer um backup completo do disco, tentei cp o maior número possível de faixas, mas agora sobraram alguns arquivos que terminam prematuramente.

Eu já encontrei esta resposta para descobrir "a duração da música" e esta ferramenta que faz o mesmo. Para um arquivo quebrado, recebo esta saída:

ffmpeg -i broken.mp3 2>&1 | grep Duration
  Duration: 00:04:18.14, start: 0.025057, bitrate: 92 kb/s

mp3_check -a broken.mp3 2>&1| grep SONG
SONG_LENGTH         01:43.05

Portanto, ffmpeg parece depender de alguns metadados (04:18 é a duração que também é exibida no meu media player), enquanto mp3_check parece realmente ler todo o arquivo. Eu poderia usar isso para escrever um script que cobre o mp3, mas:

Existe uma solução mais fácil do que comparar ffmpeg e mp3_check output para encontrar arquivos quebrados?

Como eu faria isso com arquivos Ogg, onde não há mp3_check disponível?

    
por Jasper 27.04.2014 / 18:21

1 resposta

1

Este é o script que estou usando agora:

#!/bin/bash

echo "checking $1"

find "$1" -name "*.mp3" | while read filename; do
  echo "checking $(basename "$filename")"
  ffmpeg_dur=$(ffmpeg -i "$filename" 2>&1 | awk -F: '($1 ~ /Duration/) {printf "60*%d+%d\n", $3, $4}' | bc)
  # mp3_check_dur=$(mp3_check -a "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /SONG_LENGTH/) {printf "60*%d+%d\n", $2, $3}' | bc )
  mp3info_dur=$(mp3info -x "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /Length/) {printf "60*%d+%d\n", $2, $3}' | bc )

  if [[ -z $ffmpeg_dur ]] ; then  # some files are so broken that ffmpeg doesn't print a length
    echo "ERROR (ffmpeg): $filename"
  else
    len_diff=$(( $ffmpeg_dur - $mp3_check_dur ))
    if [[ $len_diff -gt 0 ]] ; then
      echo -e "ERROR (length): $filename\t${len_diff}"
    fi
  fi

done

A duração relatada por ffmpeg é sempre maior que a de mp3_check e mp3info . Às vezes há uma diferença de 1 segundo entre os últimos também. mp3info está disponível como pacote para algumas distribuições linux (Ubuntu, Arch, ...?), mp3_check tem que ser construído a partir da fonte.

    
por 27.04.2014 / 21:22