Verkürzte MP3- oder OGG-Dateien erkennen

587
Jasper

Ich hatte kürzlich einen Festplattenfehler und konnte meine Musikdateien nicht retten. Da mir nicht genügend Speicherplatz zur Verfügung stand, um eine vollständige Sicherung der Festplatte zu cperstellen, habe ich versucht, so viele Spuren wie möglich wiederzugeben. Jetzt stehen mir jedoch einige Dateien zur Verfügung, die vorzeitig enden.

Ich habe diese Antwort bereits gefunden, um "die Länge des Songs" und dieses Tool herauszufinden, das dasselbe tut. Für eine defekte Datei bekomme ich folgende Ausgabe:

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 

Es ffmpegscheint also, dass einige Metadaten verwendet werden (04:18 ist die Dauer, die auch in meinem Media Player angezeigt wird), während mp3_checktatsächlich die gesamte Datei gelesen wird. Ich könnte damit ein Skript schreiben, das mp3 abdeckt, aber:

Gibt es eine einfachere Lösung als Vergleichen ffmpegund mp3_checkAusgeben, um beschädigte Dateien zu finden?

Wie mache ich das mit Ogg-Dateien, wo keine mp3_checkverfügbar ist?

4
Ich habe bereits ein Bash-Skript für die erste Frage geschrieben. Soll ich das in die Frage aufnehmen? Oder passt dieses Thema besser zu Stackoverflow oder Unix + Linux? Jasper vor 10 Jahren 0
Ich möchte Sie dazu auffordern, das Skript trotzdem als Antwort zu veröffentlichen, und wenn jemand eine Lösung hat, dann sei es so. Aber vielleicht findet es auch jemand anderes hilfreich - eine Win-Win-Situation. Die Frage ist hier vollkommen in Ordnung. Wir lehnen Script-Fragen nicht ab, solange sie sich in einem Kontext befinden, den ein Power-User tun würde, jedoch nicht ausschließlich für die Programmierung. Und auch Unix / Linux-Fragen sind hier zum Thema. slhck vor 10 Jahren 0
[mp3diags] (http://mp3diags.sourceforge.net/145_transformations_list.html) scannt und erkennt abgeschnittene Dateien. Wenn Sie sich dafür entscheiden, repariert es sie sogar. Es ist für [Linux und Windows] verfügbar (http://sourceforge.net/projects/mp3diags/files/?source=navbar). nixda vor 8 Jahren 0

1 Antwort auf die Frage

1
Jasper

Dies ist das Skript, das ich jetzt verwende:

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

Die angegebene Dauer ffmpegist immer länger als die von mp3_checkund mp3info. Manchmal gibt es auch einen Unterschied von 1 Sekunde. mp3infoist als Paket für einige Linux-Distributionen (Ubuntu, Arch, ...?) verfügbar und mp3_checkmuss aus dem Quellcode erstellt werden.

Funktioniert nicht wie es ist. `mp3_check_dur` sollte in` $ ((ffmpeg_dur - mp3_check_dur)) `durch` mp3info_dur` ersetzt werden Andrey Regentov vor 9 Jahren 0