Ile wystąpień poleceń FFmpeg mogę uruchomić równolegle?

18

Zmęczyłem się uruchamianiem 8 poleceń równolegle, aby w pełni wykorzystać procesor i przyspieszyć konwersje wideo, coś takiego:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/b.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/c.mp4 > /dev/null 2>&1  &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/d.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/e.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/f.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60  -f mp4 /mnt/g.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4  /mnt/h.mp4 > /dev/null 2>&1 &

2 do 3 z nich zostaje zatrzymanych. Dlaczego to się dzieje? Czy to ograniczenie FFmpeg? Próbowałem tego na 16 i 4 rdzeniowych maszynach, EC2 c1.xlarge i cc2.8xlarge. Takie samo zachowanie. Próbowałem skomplikowanych poleceń i prostych, wciąż takich samych, 2 lub 3 zostały zatrzymane.

d33pika
źródło
3
O ile mi wiadomo, nic w FFmpeg nie powinno Cię powstrzymywać. Może to być problem z powłoką?
slhck
Co jeśli mam różne dane wejściowe dla każdego polecenia? Jak mogę uczynić ich niezależnymi, ponieważ jeśli ktoś przestanie, wszyscy przestaną.
Samson,
Czy znalazłeś jakiś parametr do korzystania z wielu procesorów ?!
Dr.jacky,
co rozumiesz przez „przestań” tutaj? bash pokazuje je jako wstrzymane?
rogerdpack

Odpowiedzi:

21

Odpowiadając na pierwotne pytanie, dlaczego niektóre zadania się zatrzymują, ffmpeg w wierszu poleceń jest interaktywny. Ciągle odczytuje dane z wiersza poleceń. Aby uruchomić je wszystkie w tle, zmień to:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &

do tego:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 &

dodanie polecenia </dev/nullmówi ffmpeg, aby nie szukał danych wejściowych, a wszystkie zadania powinny działać w tle.

DingoNV
źródło
1
Co to jest: 2> i 1
Dr.jacky
Dziękuję Ci bardzo! Miałem ten sam problem i działało to jak urok, proszę przyjąć!
fr_andres Wspiera MonicaCellio
3
@ Mr.Hyde Późno na imprezę wiem, ale 2> i 1 informuje strumień błędów, aby udał się w to samo miejsce, co gruby strumień - so / dev / null. To jest skrót od > /dev/null 2>/dev/null.
berry120
7

Tylko myśl na twój rozkaz: o wiele łatwiejszym sposobem wbijania maszyny w jedno polecenie jest łączenie wszystkiego w jedną linię:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 \
 -f mp4 /mnt/b.mp4 \
 -f mp4 /mnt/c.mp4 \
 -f mp4 /mnt/d.mp4 \
 -f mp4 /mnt/e.mp4 \
 -f mp4 /mnt/f.mp4 \
 -f mp4 /mnt/g.mp4 \
 -f mp4  /mnt/h.mp4 > /dev/null 2>&1

Możesz dodać (w zależności od wersji ffmpeg) flagę informującą serwer o użyciu wszystkich dostępnych procesorów

-threads 0

Dla odniesienia: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

NublaII
źródło
Próbowałem tego, nie wykorzystuje wydajnie wszystkich procesorów. Obciążenie pozostaje na poziomie 20-30%, hiper-wątki wcale się nie przyzwyczajają.
d33pika
2
Może ma to coś wspólnego z maszynami EC2? Właśnie uruchomiłem powyższe polecenie na maszynie z 16 rdzeniami xeon z 16 wyjściami i oto, co otrzymuję: zrzut ekranu
htop
Czy korzystasz z najnowszej wersji FFmpeg?
d33pika,
@NublaII Co to jest> / dev / null 2> & 1!?
Dr.jacky
1
@ Mr.Hyde Ukrywa przed Tobą standardowe wyjście i wyświetla wyjścia błędów. Przeczytaj to: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira,