depende do codec usado, da versão ffmpeg e da contagem de núcleos do seu processador. Às vezes é simplesmente um segmento por núcleo. Às vezes é mais complexo como:
With libx264 it is cores x 1.5 for frame threads and cores x 1 for slice threads.
Vejo que há uma opção de linha de comando -threads <count>
no ffmpeg. Qual é o valor padrão desta opção?
depende do codec usado, da versão ffmpeg e da contagem de núcleos do seu processador. Às vezes é simplesmente um segmento por núcleo. Às vezes é mais complexo como:
With libx264 it is cores x 1.5 for frame threads and cores x 1 for slice threads.
A partir de 2014, ele usa um número ideal.
Você pode verificar isso em um computador com vários núcleos examinando a carga da CPU (Linux: top
, Windows: gerenciador de tarefas) com opções diferentes para o ffmpeg:
-threads 0
(ótimo);
-threads 1
(single-threaded);
-threads 2
(2 segmentos para, por exemplo, um Intel Core 2 Duo);
nenhum (o padrão, também ideal).
edição de 2015: em uma CPU de 12 núcleos, alguns comandos ffmpeg têm top
do Linux mostrando no máximo 200% de CPU (apenas 2 núcleos), independentemente do número dado a -threads
. Portanto, o padrão ainda pode ser ótimo no sentido de "tão bom quanto este binário ffmpeg pode ser obtido", mas não ótimo no sentido de "explorar completamente meu processador leet".
Em 2015 no Ubuntu 14.04 com o ffmpeg 0.8.10-6, ele usou 1 núcleo em um sistema de 4 núcleos.
htop
mostrou isso; apenas um núcleo foi usado e obtive uma taxa de conversão de 16 fps para um vídeo FullHD.
Usar -threads 4
fez todos os meus núcleos de CPU chegarem a 100% e eu consegui uma taxa de conversão de 47 fps.
Eu usei o seguinte comando:
$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg
supondo que você tenha o encadeamento ativado, ele atribuiu 1,5x número de núcleos.
Jogar com algumas conversões em uma VM do CentOS 6.5 (Ryzen 1700 8c / 16t - vm atribuído a 12 de 16 núcleos) fazendo alguns filmes def padrão (480p) fez o seguinte:
Opção de encadeamento / Taxa de conversão (fps a 60 s) (nenhum / padrão) / 130fps -threads 1 / 70fps -threads 2 / 120fps -threads 4 / 185fps -threads 6 / 228fps -threads 8 / 204fps -threads 10 / 181fps
A parte interessante foi o carregamento da cpu (usando o htop para assisti-lo). O uso da opção no -threads acabou na faixa de 130fps com a carga espalhada por todos os núcleos em um nível de carga baixa. Usando 1 thread fez exatamente isso, carregado um núcleo em 100%. Usar qualquer outra coisa resultou em outra situação de propagação.
Como você pode ver, há também um ponto de retorno decrescente, então você teria que ajustar a opção -threads para sua máquina em particular. Para minha configuração especificamente, usando o -threads 6 (em uma máquina de 12 núcleos) resultou no melhor FPS ao converter o vídeo (de h264 para x264 em uma taxa de bits diferente para forçar uma conversão) e retorna realmente diminuiu mais threads eu joguei em isto.
Também poderia ter sido um problema de memória - só tinha 1 GB atribuído à VM. Eu posso ajustar isso e ver se isso muda alguma coisa. Ainda assim - isso mostra que o uso da opção -threads pode aumentar o desempenho; portanto, execute alguns testes em sua máquina em diferentes níveis para encontrar o ponto ideal de sua configuração.
Tags ffmpeg