ffmpeg verhindert korrekte Ausgabe mit echo?

FatManStanding

Lieutenant
Registriert
Aug. 2021
Beiträge
670
Hallo,

ich habe hier ein sehr merkwürdiges Verhalten i.V.m. ffmpeg. Ich hatte neulich ein Festplattenproblem und musste ein Recovery-Tool verwenden um eine große Menge an Video-Dateien wiederherzustellen. Ich will prüfen ob alle Dateien noch i.O. sind. Sowas habe ich früher schon einmal gemacht einfach indem man den letzten Frame des Videostreams als Einzelbild abspeichern lässt. Geht das, ist alles i.O. - zumindest der Videostream. Das ganze sieht so aus:

Code:
file_list=$(find "/pfad/zur/den/dateien" -type f -name "*.mkv")
while read line; do
    echo "$line"
    ffmpeg -y -loglevel quiet -sseof -3 -i "$line" -vsync 0 -q:v 2 -update 1 /tmp/frame.jpg
    echo $?
done <<< "$file_list"

Wenn ich nur "echo "$line" in der Schleife haben sieht die Ausgabe so aus:

Code:
/pfad/zur/den/dateien/01.mkv
/pfad/zur/den/dateien/02.mkv
/pfad/zur/den/dateien/03.mkv

Alles i.O. Nur mit ffmpeg in der Schleife kann er jede 2. Datei nicht kodieren weil er sie nicht findet. Der Pfad ist unvollständig. Lasse ich alles mit echo $line und ffmpeg laufen sieht man, dass bei jeder 2. Datei ein Teil vom Beginn des Pfades fehlt. Da steht dann:

Code:
/pfad/zur/den/dateien/01.mkv
en/dateien/02.mkv
/pfad/zur/den/dateien/03.mkv

Ich verstehe nicht welchen Einfluss ffmpeg hier auf die nächste Zeilen die eingelesen wird haben könnte.
 
Sind da Leerzeichen oder andere Sonderzeichen im Pfad? Das kommt einem ja als erstes in den Sinn ...
 
  • Gefällt mir
Reaktionen: GTrash81
Definitiv ein Leerzeichenproblem. Es gibt praktisch ganze wissenschaftliche Abhandlungen darüber, wie man Pfade mit Leerzeichen in einer Bash-Schleife verwurstet.

Eine Alternative geht über find ... -print0 | xargs -0 .... Oder die Zu-Fuß-Methode: leite die find-Ausgabe in eine Datei um und baue ein Skript daraus, das für jede Datei ffmpeg aufruft.

Ich habe neulich auch mal mit ffmpeg eine Datei prüfen wollen, weil der DVD-Rip mit ddrescue Lesefehler hatte und ich sichergehen wollte, dass die Filmdatei in Ordnung ist:
Code:
ffmpeg -v error -i file.avi -f null - 2>error.log
Gefunden hier.
 
  • Gefällt mir
Reaktionen: GTrash81
Ich habe Varianten mit und ohne Leerzeichen versucht. Sonderzeichen gibt es auch keine. Wenn ich statt ffmpeg direkt auszuführen es in eine Datei umleite (also "echo ffmpeg ..." > datei) sind die Pfade korrekt.

Code:
ffmpeg -v error -i file.avi -f null - 2&gt;error.log

Das Problem tritt auch hier auf.

Ich werde das jetzt wohl so machen, dass ich die Zeile in ein Script umleite und das Script ausführe. ffmpeg macht generell manchmal komische Sachen.
 
FatManStanding schrieb:
Das Problem tritt auch hier auf.
Wie zu erwarten, das ändert ja nichts daran, wie die Dateinamen von find an ffmpeg übergeben werden. Vergiss dann nicht, im Skript Anführungszeichen um die Dateinamen zu schreiben.
 
Das habe ich auch gemacht.

Es scheint aber mit "-nostdin" bei ffmpeg zu gehen. Muss das noch genauer testen.
 
Zurück
Oben