Como posso usar a codificação CRF com nvenc no ffmpeg?


22

Este é o meu comando atual para redimensionar vídeos (1080p) de 2 GB a 300 MB, mas leva muito tempo:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Eu tentei nvenc com minha NVIDIA GTX1070:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

O tamanho da saída é sempre 3⨉ ou 5⨉ do tamanho original - o nvenc não usa -crf.

Então, como uso o nvenc com ffmpeg para converter / redimensionar um vídeo com alta qualidade e tamanho pequeno? Devo usar a GPU para codificação?


Você pode mudar slowpara fastno seu primeiro comando. O CRF não está implementado no nvenc.
— Gyan 31/07

O objetivo do NVENC é permitir a codificação de vídeo em tempo real (para itens como videochamadas); qualidade é uma consideração subordinada.
— CL.

Respostas:


23

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 cqvalor 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 -cqescala é 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 4o codificador use 4 quadros B.

As peças-chave são o -cq:v 19e os -rc:v vbr_hqargumentos, que lhe permitem ajustar o codificador tanto com uma taxa de bits variável predefinido e um bitrate máximo permitido ( -b:ve -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:

  1. 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.

  1. 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

1
Ótima resposta! O wiki do ffmpeg no nvenc está um pouco desatualizado e carece de todas essas informações ... se você tiver alguns minutos, seria ótimo se você pudesse contribuir com seu conhecimento lá: trac.ffmpeg.org/wiki/HWAccelIntro
— slhck

1
agradecer pela resposta :) ffmpeg wiki precisam de mais resposta como esta
— hongducwb

Obrigado pelo feedback. Vou tentar adicionar isso ao wiki do FFmpeg.
— 林正浩

saída de arquivos de cores parecer mais escuro, eu me lembro de um argumentos pode controlar a cor mesmo como arquivo de entrada
— hongducwb

2
vbr_minqpparece estar obsoleto agora. Concordo que essa resposta pode ser mal interpretada, pois não existe um modo de CRF h264_nvenc.
— slhck 6/09/17

4

Acredito que encontrei uma solução:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Parece que h264_nvenc usa em -qpvez de -crf. Esta opção funciona apenas enquanto -rcestiver definida como constqp.


1
Não, -qpé tudo diferente de -crf. h264_nvenc 's -qpé equivalente a libx264 ' s-qp
— Meow

@ Meow Está perto o suficiente para mim, mas é bom saber que há uma diferença. Para quem pode ver isso no futuro, esta página explica a diferença entre CRF e QP.
— Alexander01998

3

Para -crfsubstituição da libx264 pode ser -cqou -qpde h264_nvenc:

-crf Selecione a qualidade para o modo de qualidade constante

-cq Defina o nível de qualidade desejado (0 a 51, 0 significa automático) para o modo de qualidade constante no controle de taxa VBR

-qp Método de controle de taxa de parâmetro de quantização constante (de -1 a 51) (padrão -1)

Método de codificação acelerada por hardware mais rápido:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizeresolução na entrada (em hardware); não é necessário compilar o ffmpeg --enable-libnpppara o scale_nppfiltro.

Para mais informações:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.