FFmpeg baixo uso da CPU

1

Estou usando o FFmpeg para converter vários arquivos de MP4 (H264 e AC3) para MP4 (H264 e AAC) usando o comando ffmpeg -i in.mp4 -c:v copy -c:a aac out.mp4

Eu tenho uma CPU de 4 núcleos com hyper-threading que mostra cerca de 15% de uso ao fazer a conversão. Os arquivos estão localizados em um SSD e a atividade do disco está em torno de 3MB / s, portanto, o disco não parece ser um gargalo.

Quando a codificação inicia, a CPU atinge sua frequência máxima, mas eu não notei a carga em qualquer um dos núcleos ultrapassando cerca de 50%.

O FFmpeg faz mau uso de múltiplos núcleos? Existe alguma maneira de tornar a codificação mais rápida?

    
por user2248702 06.04.2017 / 15:37

2 respostas

1

A única coisa que você está codificando é o áudio, e a maioria das bibliotecas de codificação de áudio existentes é de thread único. Isso é mais provável porque a codificação de áudio já é muito rápida como um aplicativo de thread único (quando comparado à codificação de vídeo) e não usa muita memória, por isso é possível codificar cada arquivo usando um único thread e apenas iniciar como muitos processos separados, conforme necessário, para saturar totalmente a CPU. Fator no fato de que o multi-threading também não necessariamente resulta em melhorias de desempenho linear e você provavelmente tem a razão pela qual os desenvolvedores da maioria dos codificadores de áudio não acham que o multi-threading é uma alta prioridade. Eu sei apenas de dois codificadores de áudio que implementam multi-threading - LAME MT para MP3 e pflac para FLAC - e ambos são modificações separadas que não fazem parte das principais bases de código dos projetos dos quais derivam.

Quanto ao uso da CPU, com hyper-threading, você tem 8 núcleos lógicos e um oito de 100% é 12,5%, o que não é muito longe de seu valor de utilização de 15%. Eu não tenho certeza porque o sistema não está mostrando uma carga de 100% em qualquer um dos núcleos, talvez o sistema operacional esteja movendo o processo entre os núcleos para nivelar a carga ou algo assim.

Se você precisar codificar um grande número de arquivos, convém escrever um script que gere múltiplos processos FFmpeg para codificar vários arquivos ao mesmo tempo. Eu tenho muito pouca experiência em programação / script, mas eu sei de uma ferramenta de código aberto que aplica a mesma lógica para otimização de imagem: picopt . Então, se você precisar de um ponteiro sobre como fazer isso em Python, pode dar uma olhada no código-fonte do picopt.

    
por 11.04.2017 / 18:38
0

verifique ffmpeg -hwaccels

de link

-hwaccels List all hardware acceleration methods supported in this build of ffmpeg.

-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)
Select a device to use for hardware acceleration.

This option only makes sense when the -hwaccel option is also specified. Its exact meaning depends on the specific hardware

acceleration method chosen.

vdpau
For VDPAU, this option specifies the X11 display/screen to use. If this option is not specified, the value of the DISPLAY environment

variable is used

dxva2
For DXVA2, this option should contain the number of the display adapter to use. If this option is not specified, the default adapter

is used.

qsv
For QSV, this option corresponds to the values of MFX_IMPL_* . Allowed values are:

auto
sw
hw
auto_any
hw_any
hw2
hw3
hw4
    
por 06.04.2017 / 16:30