2012-12-21 27 views
8

ich einen Bash-Skript, das ich erstellt Videos aus einem Ordner zu verarbeiten und es ist Unterordner:Bash while-Schleife warten, bis Aufgabe abgeschlossen

find . -type f -name '*.mkv' | while read file; 
do 
    ffmpeg -i $file ... 
done 

Das Problem: Statt der while-Schleife ffmpeg warten zu vervollständigen, es läuft weiter durch die Schleife. Das Endergebnis ist, Dateien werden nicht verarbeitet. Ich brauche einen Weg, um die aktuelle while-Schleife Iteration zu warten, bis ffmpeg abgeschlossen ist, bevor Sie mit der nächsten fortfahren. Oder alternativ eine Möglichkeit, diese Elemente in eine Warteschlange zu stellen.

Edit: So ist die Lösung, wenn sie über eine Reihe von Dateien iterieren ist der -nostdin param passieren ffmpeg. Hoffe, das hilft jedem anderen, der ein ähnliches Problem haben könnte.

Auch Datei -> $ file war ein copy/paste Tippfehler.

+0

Vielleicht halten den Prozess im Hintergrund der '&' am Ende des 'ffmpeg' Befehl? – squiguy

+0

Was Sie haben, sollten warten bis ffmpeg fertig ist. Sind Sie sicher, dass Sie von ffmpeg keinen Fehler bekommen (wie ungültige Parameter)? – Mat

+3

Die Schleife, wie Sie sie haben, sollte warten, bis jeder der inneren Befehle ausgeführt wird, außer Sie haben ein '&' am Ende der Zeile gesetzt. Erhalten Sie Fehlermeldungen? Versuchen Sie, den inneren Befehl mit "echo" vorzugeben und fügen Sie danach einen Schlaf 1 hinzu, um zu überprüfen, dass die Schleife selbst keine Probleme hat. Zum Beispiel, in der Befehlszeile, die Sie geben, verwenden Sie 'file' anstelle von' $ file' – user295691

Antwort

3

Ich weiß, ich dies vor einer Weile geschrieben, aber ich die Lösung gefunden. Danke für alle Antworten. Die Bereitstellung des -nostdin-Parameters für ffmpeg wird ausreichen. Es wird nur die aktuelle Datei verarbeitet, bevor die nächste Datei zur Verarbeitung verwendet wird.

-nostdin Option des ffmpeg vermeidet versucht, eine Benutzereingabe von stdin ansonsten die Videodatei selbst interpretiert zu lesen ist.

ffmpeg -i <filename> ... -nostdin 

Der beste Teil der oben über die Verwendung ist, dass Sie einen Fehler Ausführlichkeit verwenden, falls weiterhin in der Ausgabe ausgelöst wird:

ffmpeg -i <filename> ... -nostdin -loglevel panic 

ODER wenn Sie lieber die Ausgabe in eine Datei berichten würde tun so auf diese Weise:

# Custom log name (optional). Helpful when multiple files are involved. 
# FFREPORT=./${filename}-$(date +%h.%m.%s).log 
ffmpeg -i <filename> ... -nostdin -report 

Sie auch eine Kombination der beiden als auch nutzen können. Auch danke @Barmar für die Lösung!

3

Ich denke, das ist so einfach wie Sie die $ vor file fehlt.

find . -type f -name '*.mkv' | while read file; 
do 
    ffmpeg -i $file ... 
done 
3

Das ist gut für Sie?

find . -type f -name '*.mkv' -exec ffmpeg -i {} \; 
2

Ich bin eine bösartige Antwort Snatcher. Ich fand ein:

ffmpeg -i $file & 
wait $! 

Dank Puchu, hier: apply ffmpeg to many files

+0

Dies ist ein interessanter Ansatz, den ich versuchen muss. Vielen Dank! Ich fand, dass die Bereitstellung der ffmpeg param-Nostdin den Trick gemacht hat. – mac2017

Verwandte Themen