Quante istanze di comandi FFmpeg posso eseguire in parallelo?


18

Mi sono stancato di eseguire 8 comandi in parallelo per utilizzare completamente la CPU e accelerare le conversioni video, qualcosa del genere:

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 a 3 di loro vengono fermati. Perché succede? È una limitazione di FFmpeg? Ho provato questo su 16 macchine core e 4 core, EC2 c1.xlarge e cc2.8xlarge. Stesso comportamento. Ho provato comandi complicati e semplici, sempre uguali, 2 o 3 vengono arrestati.


3
Per quanto ne so, in FFmpeg non dovrebbe esserci nulla che ti impedisca di farlo. Potrebbe essere un problema di shell?
Slhck,

Cosa succede se ho input diversi per ciascun comando? Come posso renderli indipendenti, perché se uno si ferma tutti si fermano.
Sansone

Hai trovato qualche parametro per l'utilizzo di processori multipli ?!
Dr.jacky,

cosa intendi per "fermati" qui? bash li mostra come in pausa?
rogerdpack,

Risposte:


21

Nel rispondere alla domanda originale, sul motivo per cui alcuni dei lavori si interrompono, ffmpeg sulla riga di comando è interattivo. Legge costantemente l'input dalla riga di comando. Per poterli eseguire tutti in background, è necessario modificare questo:

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

a questo:

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

l'aggiunta di </dev/nulldice a ffmpeg di non cercare input e che tutti i lavori dovrebbero essere eseguiti in background.


1
Di cosa si tratta: 2> & 1
Dr.jacky,

Grazie mille! Ho avuto lo stesso problema e questo ha funzionato come un incantesimo, per favore accetta!
fr_andres SupportsMonicaCellio il

3
@ Mr.Hyde In ritardo alla festa, lo so, ma 2> & 1 dice al flusso di errori di andare nello stesso posto del flusso robusto - quindi / dev / null. È una scorciatoia per > /dev/null 2>/dev/null.
Berry120,

7

Solo un pensiero sul tuo comando: un modo molto più semplice di martellare la macchina con un solo comando è concatenare tutto in una sola riga:

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

Potresti voler aggiungere (a seconda della tua versione di ffmpeg) un flag per dire al server di usare tutti i processori disponibili

-threads 0

Per riferimento: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs


Ho provato questo, non utilizza tutti i processori in modo efficiente. Il carico rimane al 20-30%, gli hyper thread non si abituano affatto.
d33pika,

2
Forse ha qualcosa a che fare con le macchine EC2? Ho appena eseguito il comando sopra su una macchina 16 xeon core con 16 uscite e questo è quello che ottengo: screenshot
htop

Sei sull'ultima versione di FFmpeg?
d33pika,

@NublaII Che cos'è> / dev / null 2> & 1!?
Dr.jacky,

1
@ Mr.Hyde Nasconde l'output standard e mostra gli output degli errori. Leggi questo: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.