Eu preciso reduzir a taxa de quadros de alguns vídeos H.264 em segundo plano sem maximizar minha CPU (no Linux). De alguma forma -threads 1
não tem efeito algum:
ffmpeg -threads 1 -i 50fps.mp4 -filter:v fps=30 30fps.mp4
Informações da transmissão:
Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt470bg, progressive)
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D)
Todos os núcleos ainda estão no máximo. Como posso limitar isso a apenas um núcleo? H.265 tem uma opção específica de codificador para isso ( pools=none
), existe algo semelhante que eu possa usar aqui?
Você pode fazer isso com
taskset
:para executar seu processo ffmpeg confinado ao 1º núcleo da CPU (contando a partir de 0). Ou, por exemplo, para executá-lo no 1º e 3º núcleo:
Os threads de codificação de vídeo são definidos por output
-threads
.Então,
O objetivo é impedir que outros softwares funcionem mal porque o ffmpeg está sobrecarregando a CPU em segundo plano?
Nesse caso, recomendo executá-lo com maior gentileza:
Isso permitirá que o escalonador minimize a prioridade do ffmpeg e o preempção imediatamente caso qualquer outro processo precise de CPU, e ainda permite que você utilize todos os núcleos para codificar o mais rápido possível.
Se você estiver usando uma distribuição Linux que usa systemd, poderá usar uma se seus utilitários forem chamados systemd-run para controle de recursos. Para o seu caso seria assim:
Para
AllowedCPUs
, você pode mencionar o índice do núcleo lógico ao qual deseja restringir a execução do seu comando. O índice é 0 para o primeiro núcleo lógico, 1 para o segundo núcleo lógico e assim por diante.Para , 100% é igual ao tempo máximo de CPU disponível
CPUQuota
de um núcleo lógico . 200% seriam dois núcleos lógicos e assim por diante.Exemplo A:
Exemplo B:
Leituras sugeridas: manual do systemd-run e systemd.resource-control .
Eu uso rotineiramente cpulimit para limitar a carga geral em minha máquina com backups compactados GRANDES noturnos, como o seguinte:
Eu me perguntava qual era a diferença entre cpulimit e taskset e deduzo deste site que cpulimit é um acelerador enquanto o taskset estabelece afinidades. De fato, se eu estiver acordado até tarde, posso ouvir meus ventiladores subindo e descendo, de modo que a carga média geral nos núcleos da CPU seja de 30% (no exemplo acima).
Eu também usei isso para estrangular o ffmpeg pelo mesmo motivo que o questionador perguntou, embora eu geralmente esteja fazendo isso "prático".