2012-12-21 29 views
8

Mam skrypt bash, który stworzyłem na przetwarzanie wideo z w folderze i jego podfolderach:Bash pętli while czekać aż zadanie zakończyło

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

Problem: Zamiast pętli czekając ffmpeg do wypełnienia, kontynuuje iterację w pętli. W rezultacie pliki nie są przetwarzane. Potrzebuję sposobu, aby aktualna iteracja pętli czekała, aż ffmpeg zostanie ukończona, zanim przejdę do następnej. Lub alternatywnie sposób na kolejkowanie tych elementów.

Edycja: Tak Rozwiązaniem podczas iteracji po zbiorze plików jest przekazanie parametru -nostdin do ffmpeg. Mam nadzieję, że to pomoże każdemu, kto może mieć podobny problem.

Również plik -> $ był kserokopią.

+0

Może przykleić proces w tle za pomocą '&' na końcu polecenia 'ffmpeg'? – squiguy

+0

Co powinieneś poczekać na zakończenie ffmpeg. Czy na pewno nie otrzymujesz błędu od ffmpeg (jak nieprawidłowe parametry)? – Mat

+3

Pętla, jak to masz, powinna poczekać, aż uruchomią się wszystkie wewnętrzne polecenia, chyba że umieścisz '&' na końcu linii. Czy masz jakieś komunikaty o błędach? Spróbuj poprzedzić wewnętrzne polecenie za pomocą "echa" i dodając po nim przeskok 1, aby sprawdzić, czy sama pętla nie ma problemów. Na przykład w wierszu komend, który podasz, używasz 'pliku' zamiast' $ file'' – user295691

Odpowiedz

3

Zdaję sobie sprawę, że pisał to jakiś czas temu, ale znalazłem rozwiązanie. Dziękuję za wszystkie odpowiedzi. Dostarczenie -nostdin param do ffmpeg zrobi lewy. Przetworzy tylko bieżący plik przed przejściem do następnego pliku w celu przetworzenia.

Opcja ffmpeg -nostdin zapobiega próbie odczytania danych wprowadzanych przez użytkownika ze standardowego wejścia, inaczej sam plik wideo zostanie zinterpretowany.

ffmpeg -i <filename> ... -nostdin 

Najlepsze strony o użyciu powyższego jest to, że można nadal korzystać gadatliwość w przypadku błąd jest generowany na wyjściu:

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

LUB jeśli wolisz zgłosić wyjście do pliku zrób to w ten sposób:

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

Możesz również użyć kombinacji dwóch. Również dzięki @Barmar za rozwiązanie!

3

Myślę, że to jest tak proste, jak brakujące $ przed file.

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

To jest dobre dla ciebie?

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

Jestem złośliwym narzędziem do odczytywania odpowiedzi. Znalazłem jeden:

ffmpeg -i $file & 
wait $! 

Dzięki Puchu, tutaj: apply ffmpeg to many files

+0

To ciekawe podejście. Muszę to wypróbować. Dzięki! Znalazłem, że pod warunkiem, że ffmpeg param -nostdin zrobił lewę. – mac2017

Powiązane problemy