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?

hongducwb
fonte
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
林正浩
fonte
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.

Alexander01998
fonte
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
abc
fonte