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.