Обнаружение усеченных mp3 или ogg файлов

527
Jasper

Недавно у меня произошел сбой жесткого диска, и я не смог спасти все свои музыкальные файлы. Поскольку у меня не было достаточно свободного места для полного резервного копирования диска, я попытался 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доступных?

4
Я уже написал сценарий bash для первого вопроса. Должен ли я включить это в вопрос? Или эта тема лучше подходит для Stackoverflow или Unix + Linux? Jasper 10 лет назад 0
Я бы посоветовал вам опубликовать сценарий как ответ в любом случае, и если у кого-то есть решение, пусть будет так. Но, может быть, кто-то еще найдет это полезным - беспроигрышная ситуация. Здесь вопрос в порядке. Мы не запрещаем вопросы сценариев, если они находятся в контексте всего, что мог бы делать опытный пользователь, но не только для программирования. И вопросы Unix / Linux тоже все по теме здесь. slhck 10 лет назад 0
[mp3diags] (http://mp3diags.sourceforge.net/145_transformations_list.html) сканирует и обнаруживает усеченные файлы. Если вы выбираете так, он даже восстанавливает их. Он доступен для [Linux и Windows] (http://sourceforge.net/projects/mp3diags/files/?source=navbar) nixda 9 лет назад 0

1 ответ на вопрос

1
Jasper

This is the script I'm now using:

#!/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/) ' | bc) # mp3_check_dur=$(mp3_check -a "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /SONG_LENGTH/) ' | bc ) mp3info_dur=$(mp3info -x "$filename" 2>&1 | awk -F'[ :.]+' '($1 ~ /Length/) ' | 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$" fi fi done 

The duration reported by ffmpeg is always longer than the one of mp3_check and mp3info. There sometimes is a 1 second difference between the latter as well. mp3info is available as package for some linux distributions (Ubuntu, Arch, ...?), mp3_check has to be built from source.

Не будет работать "как есть". `mp3_check_dur` должен быть заменен на` mp3info_dur` в `$ ((ffmpeg_dur - mp3_check_dur))` Andrey Regentov 9 лет назад 0

Похожие вопросы