Quantas instâncias de comandos do FFmpeg posso executar em paralelo?

18

Eu cansei de executar 8 comandos em paralelo para utilizar totalmente a CPU e acelerar as conversões de vídeo, algo como isto:

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 deles são parados. Por que isso acontece? Isso é uma limitação do FFmpeg? Eu tentei isso em máquinas de 16 e 4 núcleos, EC2 c1.xlarge e cc2.8xlarge. Mesmo comportamento. Eu tentei comandos complicados e simples, mesmo assim, 2 ou 3 são interrompidos.

d33pika
fonte
3
Que eu saiba, não deve haver nada no FFmpeg impedindo você de fazê-lo. Pode ser um problema de shell?
slhck
E se eu tiver entradas diferentes para cada comando? Como posso torná-los independentes, porque se alguém para, todos eles param.
Samson
Você encontrou algum parâmetro para usar multiprocessadores ?!
precisa saber é o seguinte
o que você quer dizer com "pare" aqui? bash mostra como pausado?
Rogerdpack

Respostas:

21

Ao responder à pergunta original, por que alguns dos trabalhos são interrompidos, o ffmpeg na linha de comando é interativo. Ele está constantemente lendo as entradas na linha de comando. Para executar todos eles em segundo plano, você deve alterar isso:

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

para isso:

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

a adição de </dev/nullinstrui o ffmpeg a não procurar informações e todos os seus trabalhos devem ser executados em segundo plano.

DingoNV
fonte
11
O que é isso: 2> & 1
Dr.jacky
Muito obrigado! Eu tive o mesmo problema e isso funcionou como um encanto, por favor aceite!
Fr_andres SupportsMonicaCellio
3
@ Mr.Hyde Tarde para a festa que eu conheço, mas 2> & 1 informa ao fluxo de erro para ir para o mesmo local que o fluxo robusto - então / dev / null. É uma abreviação de > /dev/null 2>/dev/null.
precisa saber é o seguinte
7

Apenas um pensamento sobre o seu comando: uma maneira muito mais fácil de martelar a máquina com um único comando é concatenar tudo em uma única linha:

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

Você pode adicionar (dependendo da versão do ffmpeg) um sinalizador para informar ao servidor para usar todos os processadores disponíveis

-threads 0

Para referência: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

NublaII
fonte
Eu tentei isso, ele não usa todos os processadores de forma eficiente. A carga permanece entre 20 e 30%, os hiper threads não são usados.
D33pika
2
Talvez tenha algo a ver com máquinas EC2? Acabei de executar o comando acima em uma máquina de núcleo 16 xeon com 16 saídas e é isso que eu recebo: captura de tela
htop
Você está na versão mais recente do FFmpeg?
D33pika
@NublaII O que é> / dev / null 2> & 1!?
precisa saber é o seguinte
11
@ Mr.Hyde Oculta a saída padrão de você e mostra as saídas de erro. Leia este: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira