Para codificações baseadas em CRF, transmita os seguintes argumentos no snippet abaixo para FFmpeg:
-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high
Obviamente, você precisará ajustar as taxas de bits de destino e um cq
valor fixo . 19 é a configuração recomendada como visualmente idêntica a 0, mas preserva uma boa troca de compactação para o tamanho do arquivo. Veja este artigo para saber mais sobre o que o CRF faz.
Observe que a -cq
escala é logarítmica, significando que 0 é essencialmente sem perdas e 51 seria o pior absoluto.
A qualidade pode ser aprimorada ainda mais com a adição de opções como quadros B (limite isso para 3, 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 fazer isso, passe -bf {uint}
para o codificador de vídeo, de modo que -bf:v 4
o codificador use 4 quadros B.
As peças-chave são o -cq:v 19
e os -rc:v vbr_hq
argumentos, que lhe permitem ajustar o codificador tanto com uma taxa de bits variável predefinido e um bitrate máximo permitido ( -b:v
e -maxrate:v
) ao aderir a um valor CRF de 19.
E agora, pequenas notas sobre o NVENC e o ajuste para codificação 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, as seguintes limitações se aplicam:
- Os tamanhos de CTU acima de 32 não são suportados.
- Os 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 em que esses espaços de cores são necessários.
- O controle de antecipação também é limitado a 32 quadros. Você pode consultar este editorial para obter mais detalhes.
Turing tem todos os aprimoramentos disponíveis para o Pascal, com a adição do suporte de quadros B para HEVC e a capacidade de usar quadros B como referência. Veja esta resposta para um exemplo sobre esse recurso.
E no Maxwell Gen 2 (GPUs da série GM200x):
A codificação HEVC não possui os seguintes recursos:
O impacto aqui para Maxwell é que cenas pesadas em movimento com HEVC sob taxas de bits restritas podem sofrer artefatos (bloqueios) devido às funções de lookahead ausentes e aos recursos de filtragem de loop de deslocamento de amostra adaptável (SAO). O Pascal melhorou um pouco esse recurso, mas, dependendo da versão do SDK com a qual o codificador de vídeo foi criado, nem todos os recursos podem estar disponíveis.
Por exemplo, o modo de previsão ponderada para codificação H.264 no Pascal requer o NVENC SDK 8.0x e superior, e esse modo de codificação também desativará o suporte a quadros B. Da mesma forma, a combinação de escaladores baseados em hardware que executam o Nvidia Performance Primitives (NPP) com o NVENC pode introduzir aprimoramentos de desempenho nos aplicativos de escalabilidade de vídeo à custa de escalar artefatos, particularmente com conteúdo escalonado. O mesmo também afeta o pipeline de codificação de vídeo, pois as funções de dimensionamento da NPP executam os núcleos CUDA na GPU e, como tal, o impacto no desempenho introduzido pela carga extra deve ser analisado caso a caso para determinar se a qualidade do desempenho o trade-off é aceitável.
Lembre-se: um codificador baseado em hardware sempre oferecerá personalização um pouco menor do que uma implementação equivalente baseada em software 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 codificadores baseados em NVENC e escaladores baseados em NPP (se criados como tais) 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
slow
parafast
no seu primeiro comando. O CRF não está implementado nonvenc
.