¿Cuántas instancias de comandos FFmpeg puedo ejecutar en paralelo?

18

Estoy cansado de ejecutar 8 comandos en paralelo para utilizar completamente la CPU y acelerar las conversiones de video, algo como esto:

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 &

De 2 a 3 de ellos se detienen. ¿Por qué pasó esto? ¿Es esta una limitación de FFmpeg? He intentado esto en máquinas de 16 y 4 núcleos, EC2 c1.xlarge y cc2.8xlarge. Mismo comportamiento. He intentado comandos complicados y simples, aún iguales, 2 o 3 se detienen.

d33pika
fuente
3
Que yo sepa, no debería haber nada en FFmpeg que te impida hacerlo. ¿Podría ser un problema de shell?
slhck
¿Qué pasa si tengo diferentes entradas para cada comando? ¿Cómo puedo hacerlos independientes, porque si uno se detiene, todos se detienen?
Samson
¿Encontraste algún parámetro para usar multiprocesadores?
Dr.jacky
¿Qué quieres decir con "detenerse" aquí? bash los muestra en pausa?
rogerdpack

Respuestas:

21

Al responder la pregunta original, en cuanto a por qué algunos de los trabajos se detienen, ffmpeg en la línea de comando es interactivo. Está constantemente leyendo la entrada en la línea de comando. Para que pueda ejecutarlos todos en segundo plano, debe cambiar esto:

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

a esto:

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

la adición de </dev/nullle dice a ffmpeg que no busque entradas, y todos sus trabajos deberían ejecutarse en segundo plano.

DingoNV
fuente
1
Qué es esto: 2> & 1
Dr.jacky
¡Muchas gracias! Tuve el mismo problema y esto funcionó de maravilla, ¡por favor acepte!
fr_andres SoportesMonicaCellio
3
@ Mr.Hyde Tarde a la fiesta, lo sé, pero 2> & 1 le dice a la secuencia de error que vaya al mismo lugar que la secuencia sólida, así que / dev / null. Es taquigrafía para > /dev/null 2>/dev/null.
berry120
7

Solo piense en su comando: una forma mucho más fácil de martillar la máquina con un solo comando es concatenar todo en una sola línea:

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

Es posible que desee agregar (según su versión de ffmpeg) un indicador para indicarle al servidor que use todos los procesadores disponibles

-threads 0

Para referencia: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

NublaII
fuente
He intentado esto, no utiliza todos los procesadores de manera eficiente. La carga permanece en 20-30%, los hiperprocesos no se utilizan en absoluto.
d33pika
2
¿Quizás tiene algo que ver con las máquinas EC2? Acabo de ejecutar el comando anterior en una máquina de 16 núcleos xeon con 16 salidas y esto es lo que obtengo: captura de pantalla de
htop
¿Estás en la última versión de FFmpeg?
d33pika
@NublaII ¿Qué es> / dev / null 2> & 1!?
Dr.jacky
1
@ Mr.Hyde Le oculta la salida estándar y le muestra salidas de error. Lea esto: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira