Como minimizar o uso de CPU / memória por ffmpeg ao gravar vídeo

13

Eu uso o FFmpeg para fazer a captura de tela de vídeo a partir do visor Xvfb.

Atualmente, eu o invoco com:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Enquanto eu gravo vídeos de cerca de 5 sessões Xvfb, meu uso da CPU é muito alto e há defasagens por causa disso. Além disso, o uso da memória é de cerca de 300 MB para cada um dos processos ffmpeg.

Quais parâmetros do ffmpeg devo usar para minimizar o uso de recursos do computador (principalmente CPU e memória) ao fazer a captura de tela de vídeo?

Andrei Botalov
fonte

Respostas:

17

1. Faça uma saída RGB sem perdas primeiro

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • A entrada é RGB, portanto, o uso do codificador libx264rgb evitará a conversão potencialmente lenta de RGB para YUV que ocorreria se você usasse a libx264 simples.

  • Ele usa a predefinição de codificação x264 mais rápida: ultra-rápida.

  • A saída será sem perdas porque -crf 0é usada.

2. Em seguida, recodifique-o

A saída do primeiro comando será enorme e a maioria dos jogadores burros não pode lidar com o RGB H.264, para que você possa recodificá-lo:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Você pode experimentar o -crfvalor para controlar a qualidade da saída. Uma faixa subjetivamente sã é 18-28, onde 18 é visualmente sem perdas ou quase isso. O padrão é 23.

  • Use a predefinição mais lento tem paciência para: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. O padrão é medium.

  • Eu adicionei -vf format=yuv420ppara garantir que a saída funcione com players burros como o QuickTime e o Windows Media Player. Você pode omitir isso se estiver fazendo o upload para o YouTube ou apenas reproduzindo-o em VLC, MPV, MPlayer ou qualquer outro player baseado em FFmpeg.

Veja também

llogan
fonte
I capturar vídeo de exibição non-default (é Xvfb), por isso pode ser qualquer número
Andrei Botalov
@AndreyBotalov Você tentou o método sem perdas? Foi melhor para você?
Llogan 26/10/2013
1
Atualmente, invoco ffmpegcom o -preset superfastparâmetro (ainda não tentei -crf). Nesse caso, são necessários menos recursos e produz vídeos de tamanho suficiente.
Andrei Botalov 26/10/2013
@AndreyBotalov -crf 23é usado por padrão se você não declarar um valor, mas mesmo assim se superfastfor suficiente para você, talvez o problema esteja resolvido.
Llogan 26/10/2013
1
Você também pode tentar a codificação de hardware via h264_nvenc (nvidia) ou h264_qsv (modern intel cpu). Isso mudará o ônus da codificação da sua CPU para o hardware h264 dedicado.
Kenn
4

É melhor se concentrar no uso de diferentes opções de ffmpeg que alcançarão o mesmo resultado de uma maneira que use menos recursos. Dito isto, existem maneiras de usar menos recursos se você realmente precisar realizar algo específico com o ffmpeg e ele estiver usando muitos recursos.

Você pode diminuir a prioridade do ffmpegprocesso da CPU:

  • Método Terminal: Use o nicecomando para alterar a prioridade do processo: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. No Linux, o número da prioridade (o niceformato do comando é nice -n <priority> <command>) varia de -20 a 20. Quanto maior o número inteiro, menor a prioridade; neutro é 0. Se você usar o comando que eu lhe dei e configurá-lo como 8, a CPU dará ao processo menos tempo, o que parece ser menos "energia". Se esse número for muito alto ou dois baixo, é claro, você poderá alterá-lo.
  • Método da GUI: isso não é recomendado, pois oferece menos controle sobre o número exato e não entra em vigor assim que o processo é iniciado. No entanto, é mais compreensível. Com a ffmpegexecução, abra o Monitor do Sistema. Role para baixo até o processo nomeado ffmpeg, clique com o botão esquerdo para selecionar, clique com o botão direito e defina a prioridade como "Baixa" ou "Muito baixa".

Se você também estiver preocupado com o uso da memória, saiba que não é possível dizer a um processo que apenas consuma tanta memória e ainda execute. O kernel controla automaticamente a alocação de memória para processos. Há uma maneira de armazenar processos, com o timeoutscript , para que, quando um processo e qualquer processo filho ocupem muita memória (um limite definido por você), eles sejam finalizados com segurança e uma notificação seja exibida. No entanto, se um processo recebe tanta memória (digamos pelo kernel) e solicita mais memória que não pode ter, ele trava.

Algumas coisas úteis para saber sobre:

Usando o conhecimento do Cgroups, você pode fazer muitas coisas divertidas, como controlar a troca de um processo.

Richard
fonte
2
Se eu entendi corretamente, colocar o ffmpeg na fila de prioridade mais baixa fará com que ele produza vídeos com atrasos indesejados.
Andrei Botalov 24/10
1
Hmm ... não vejo nada online dizendo isso ... Você tem uma fonte que indique isso? (Caso contrário, deve ser um bug).
Richard
2
Se eu entendi corretamente a prioridade mais baixa significa que o ffmpeg terá menos tempo de processador do que agora. Mas processador é carregado quase 100%, então eu acho que redefinição de prioridades não vai ajudar
Andrei Botalov
1
Ele foi projetado para limitar o uso da CPU do processo; portanto, se sua CPU estiver funcionando a 100%, será mais fácil lidar com isso.
Richard
4
Eu tenho -1 disso, porque não importa como você mude a prioridade, isso só piorará. Definir uma prioridade mais baixa reduzirá o tempo de CPU para ffmpeg, resultando em mais quadros perdidos ou, aumentando a prioridade, diminuirá ainda mais outros processos no sistema. Ambos os resultados são indesejados.
Gdvdijk
0

-re (entrada) Leia a entrada na taxa de quadros nativa. Usado principalmente para simular um dispositivo de captura ou fluxo de entrada ao vivo (por exemplo, ao ler de um arquivo). Não deve ser usado com dispositivos de captura reais ou fluxos de entrada ao vivo (onde pode causar perda de pacotes). Por padrão, o ffmpeg tenta ler as entradas o mais rápido possível. Esta opção diminuirá a leitura das entradas para a taxa de quadros nativa das entradas. É útil para saída em tempo real (por exemplo, transmissão ao vivo).

劉 大為
fonte
"Não deve ser usado com dispositivos de garra reais", como x11grab.
Llogan 27/05