4

Недавно у меня произошел сбой жесткого диска, и я не смог спасти все свои музыкальные файлы. Поскольку у меня не было достаточно свободного места для полного резервного копирования диска, я попытался cp как можно больше дорожек, но теперь у меня остались некоторые файлы, которые заканчиваются преждевременно.

Я уже нашел этот ответ, чтобы узнать "длину песни" и этот инструмент, который делает то же самое. Для одного испорченного файла я получаю этот вывод:

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

Таким образом, ffmpeg похоже, полагается на некоторые метаданные (04:18 - это длительность, которая также отображается в моем медиаплеере), в то время как mp3_check кажется, фактически читает весь файл. Я мог бы использовать это, чтобы написать сценарий, который охватывает mp3, но:

Есть ли более простое решение, чем сравнение выходных файлов ffmpeg и mp3_check с целью поиска поврежденных файлов?

Как бы я сделал это с файлами Ogg, где нет mp3_check ?

1 ответ1

1

Это скрипт, который я сейчас использую:

#!/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

Продолжительность, сообщаемая ffmpeg , всегда больше, чем у mp3_check и mp3info . Иногда между ними также существует разница в 1 секунду. mp3info доступен в виде пакета для некоторых дистрибутивов Linux (Ubuntu, Arch, ...?), mp3_check должен быть собран из исходного кода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .