Wie viele Instanzen von FFmpeg-Befehlen kann ich parallel ausführen?

18

Ich habe es satt, 8 Befehle gleichzeitig auszuführen, um die CPU voll auszunutzen und die Videokonvertierungen zu beschleunigen.

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 bis 3 von ihnen werden gestoppt. Warum passiert das? Ist das eine FFmpeg-Einschränkung? Ich habe dies auf 16-Kern- und 4-Kern-Maschinen versucht, EC2 c1.xlarge und cc2.8xlarge. Gleiches Verhalten. Ich habe komplizierte und einfache Befehle ausprobiert, trotzdem werden 2 oder 3 gestoppt.

d33pika
quelle
3
Meines Wissens sollte nichts in FFmpeg selbst Sie daran hindern. Könnte ein Shell-Problem sein?
Slhck
Was ist, wenn ich für jeden Befehl unterschiedliche Eingaben habe? Wie kann ich sie unabhängig machen, denn wenn man aufhört, hören sie alle auf.
Samson
Haben Sie Parameter für die Verwendung von Multiprozessoren gefunden ?!
Dr.jacky
was meinst du hier mit "stehen bleiben"? Bash zeigt sie als angehalten?
Rogerdpack

Antworten:

20

Bei der Beantwortung der ursprünglichen Frage, warum einige Jobs angehalten werden, ist ffmpeg in der Befehlszeile interaktiv. Es liest ständig Eingaben auf der Kommandozeile. Damit Sie alle im Hintergrund ausführen können, sollten Sie Folgendes ändern:

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

dazu:

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

Durch Hinzufügen von </dev/nullwird ffmpeg angewiesen, nicht nach Eingaben zu suchen, und alle Ihre Jobs sollten im Hintergrund ausgeführt werden.

DingoNV
quelle
1
Was ist das: 2> & 1
Dr.jacky
Vielen Dank! Ich hatte genau das gleiche Problem und das funktionierte wie ein Zauber, bitte akzeptieren Sie!
fr_andres SupportsMonicaCellio
3
@ Mr.Hyde Spät zu der Party, die ich kenne, aber 2> & 1 teilt dem Fehlerstrom mit, dass er an die gleiche Stelle wie der dicke Stream gehen soll - also / dev / null. Es ist eine Abkürzung für > /dev/null 2>/dev/null.
Berry120
7

Nur ein Gedanke zu Ihrem Befehl: Eine viel einfachere Möglichkeit, die Maschine mit einem einzigen Befehl zu hämmern, besteht darin, alles in einer einzigen Zeile zusammenzufassen:

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

Möglicherweise möchten Sie (abhängig von Ihrer ffmpeg-Version) ein Flag hinzufügen, um den Server anzuweisen, alle verfügbaren Prozessoren zu verwenden

-threads 0

Als Referenz: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

NublaII
quelle
Ich habe dies versucht, es nutzt nicht alle Prozessoren effizient. Die Last bleibt bei 20-30%, die Hyper-Threads werden überhaupt nicht genutzt.
d33pika
2
Vielleicht hat es etwas mit EC2-Maschinen zu tun? Ich führe gerade den obigen Befehl auf einem 16-xeon-Core-Rechner mit 16 Ausgängen aus und das bekomme ich: htop
screenshot
Bist du auf der neuesten Version von FFmpeg?
d33pika
@NublaII Was ist> / dev / null 2> & 1!?
Dr.jacky
1
@ Mr.Hyde Es verbirgt die Standardausgabe von Ihnen und zeigt Ihnen Fehlerausgaben. Lies dies: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira