Para codificações baseadas em CRF, passe os seguintes argumentos no snippet abaixo para o FFmpeg:
-c:v h264_nvenc -preset llhq -rc:v vbr_minqp -qmin:v 19 -qmax:v 21 -b:v 2500k -maxrate:v 5000k -profile:v high
Claro, você precisará ajustar as taxas de bits de destino e um valor mínimo e máximo de -qp
do destino. 19 é a configuração recomendada como "visualmente idêntica a 0, mas preserva a boa compactação para o tamanho do arquivo. 21 é o valor de pico que impede o codificador de não exceder esse valor dentro da faixa de taxa de bits especificada.
Observe que a escala -qp
é logarítmica, significando que 0 é essencialmente sem perdas e 51 seria o pior absoluto.
A qualidade pode ser aprimorada com a adição de opções como B- frames (limite isso para 4, no máximo, e isso requer o perfil principal H.264 e acima. Os perfis de linha de base não suportam quadros B. Para isso, passe -bf {uint}
para o codificador de vídeo, de modo que -bf:v 4
resultaria no codificador usando 4 quadros B.
As principais partes aqui são os argumentos -preset
e -rc:v vbr_minqp
, que permitem ajustar o codificador com uma taxa de bits variável predefinida e uma taxa de bits máxima permitida. ( -b:v
e -maxrate:v
)
E agora, pequenas notas sobre o NVENC e ajustes para codificações de alta qualidade:
O NVENC, como qualquer outro codificador baseado em hardware, tem várias limitações, e em particular com o HEVC, aqui estão as limitações conhecidas:
-
Em Pascal:
Para codificações HEVC, aplicam-se as seguintes limitações:
- Tamanhos de CTU acima de 32 não são suportados.
- quadros B no HEVC também não são suportados.
- Os formatos de textura suportados pelo codificador NVENC limitam os espaços de cores com os quais o codificador pode trabalhar. Por enquanto, temos suporte para 4: 2: 0 (8 bits) e 4: 4: 4 (para 10 bits). Formatos estranhos como 4: 2: 2 de 10 bits não são suportados. Isso afetará alguns fluxos de trabalho nos quais esses espaços de cores são necessários.
- O controle antecipado também é limitado a 32 quadros. Você pode querer olhar para este editorial para saber mais detalhes.
-
E no Maxwell Gen 2 (GPUs da série GM200x):
A codificação HEVC não possui os seguintes recursos:
- Recursos de filtro de loop do desvio adaptativo da amostra (SAO).
- Quantização adaptativa
- Controle de taxa de visualização antecipada.
O impacto aqui para Maxwell é que as cenas pesadas de movimento com HEVC sob taxas de bits restritas podem sofrer artefatos (bloqueio) devido às funções de antecipação ausentes e recursos de filtragem de loop de desvio de amostra adaptável (SAO). O Pascal melhorou um pouco essa capacidade, mas, dependendo da versão do SDK com o qual o codificador de vídeo foi criado, nem todos os recursos podem estar disponíveis.
Por exemplo, o modo de predição ponderada para codificações H.264 em Pascal requer NVENC SDK 8.0x e acima, e esse modo de codificação também desativará o suporte a quadros B. Da mesma forma, a combinação de scalers baseados em hardware executando o Nvidia Performance Primitives (NPP) com NVENC pode introduzir melhorias de desempenho com aplicativos de escala de vídeo ao custo de artefatos de dimensionamento, particularmente com conteúdo aprimorado. O mesmo também afeta o pipeline de codificação de vídeo, pois as funções de escala do NPP são executadas nos núcleos CUDA da GPU e, como tal, o impacto de desempenho introduzido pela carga extra deve ser analisado caso a caso para determinar se a qualidade de desempenho o trade-off é aceitável.
Tenha isso em mente: um codificador baseado em hardware sempre oferecerá uma personalização um pouco menor do que uma implementação baseada em software equivalente e, como tal, sua milhagem e qualidade de saída aceitável sempre serão diferentes.
E para sua referência:
Com o FFmpeg, você sempre pode consultar as configurações de um codificador para personalização:
ffmpeg -h encoder {encoder-name}
Portanto, para codificadores baseados em NVENC, você pode executar:
ffmpeg -h encoder=hevc_nvenc
ffmpeg -h encoder=h264_nvenc
Você também pode ver todos os encoders baseados em NVENC e scalers baseados em NPP (se construído como tal) executando:
for i in encoders decoders filters; do
echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done
Exemplo de saída no meu testbed:
encoders:
V..... h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
decoders:
V..... h263_cuvid Nvidia CUVID H263 decoder (codec h263)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)
V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)
V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)
V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)
V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)
V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)
filters:
... hwupload_cuda V->V Upload a system memory frame to a CUDA device.
... scale_npp V->V NVIDIA Performance Primitives video scaling and format conversion