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

13

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

Atualmente, invoco-o com:

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

Enquanto gravo vídeo de aproximadamente 5 sessões Xvfb, meu uso de CPU é muito alto e há atrasos por causa disso. O uso de memória também é de cerca de 300 MB para cada um dos processos do ffmpeg.

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

    
por Andrei Botalov 24.10.2013 / 19:25

3 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, usar o codificador libx264rgb evitará a conversão RGB para YUV potencialmente lenta que ocorreria se você usasse libx264 simples.

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

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

2. Então recodifique-o

A saída do primeiro comando será enorme, e os jogadores mais burros não poderão manipular 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 valor -crf para controlar a qualidade da saída. Uma faixa subjetivamente sã é 18-28, onde 18 é visualmente sem perdas ou quase. O padrão é 23.

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

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

Veja também

por LordNeckbeard 24.10.2013 / 21:50
4

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

Você pode diminuir a prioridade do processo de CPU de ffmpeg :

  • Método de terminal: Use o comando nice 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 de prioridade (o formato do comando nice é nice -n <priority> <command> ) varia de -20 a 20. Quanto maior o inteiro, menor a prioridade é; O neutro é 0. Se você usar o comando que eu lhe dei e configurá-lo para 8, a CPU dará menos tempo ao processo, o que parece ser menos "poder". Se esse número for muito alto ou dois baixo, é claro, você pode alterá-lo.
  • Método da GUI: Isso não é recomendado porque dá menos controle sobre o número exato e não entra em vigor assim que o processo é iniciado. No entanto, é mais compreensível. Com ffmpeg em execução, abra o Monitor do Sistema. Role para baixo até o processo chamado ffmpeg , clique com o botão esquerdo para selecionar, clique com o botão direito e defina a prioridade para "Baixo" ou "Muito baixo".

Se você também está preocupado com o uso da memória, sabe que não é possível dizer a um processo para tirar tanta memória e ainda executar. O kernel controla automaticamente a alocação de memória para processos. Há uma maneira de bloquear processos, com o script timeout , para que, quando um processo e qualquer processo filho ocuparem muita memória (um limite definido por você), eles sejam encerrados com segurança e uma notificação seja exibida. No entanto, se um processo recebe apenas muita memória (digamos, pelo kernel) e solicita mais memória que não pode ter, ele irá falhar.

Algumas informações úteis sobre o assunto:

  • Cgroups - link
  • O controlador de memória do kernel - link

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

    
por Richard 24.10.2013 / 20:20
0

-re (entrada) Leitura de 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 ativos (onde isso pode causar a perda de pacotes). Por padrão, o ffmpeg tenta ler a (s) entrada (s) o mais rápido possível. Esta opção irá desacelerar a leitura da (s) entrada (s) para a taxa de quadros nativa da (s) entrada (s). É útil para a saída em tempo real (por exemplo, transmissão ao vivo).

    
por 劉大為 26.05.2017 / 12:11