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

9

Este é o meu comando atual para redimensionar vídeos (1080p) de 2 GB para 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 o nvenc com a 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 de saída é sempre 3⨉ ou 5⨉ o tamanho original - o nvenc não usa -crf .

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

    
por hongducwb 31.07.2017 / 17:49

3 respostas

13

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:

  1. 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.
  2. 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 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
    
por 01.08.2017 / 05:48
2

Para a substituição -crf da libx264 pode ser -cq ou -qp de h264_nvenc:

-crf Selecione a qualidade para o modo de qualidade constante

-cq Define o nível de qualidade alvo (0 a 51, 0 significa automático) para 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

-resize de resolução na entrada (em hardware); não há necessidade de o ffmpeg ser compilado com --enable-libnpp para o filtro scale_npp .

Para mais informações:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
    
por 25.05.2018 / 18:22
1

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 -qp em vez de -crf . Essa opção só funciona enquanto -rc está definido como constqp .

    
por 26.01.2018 / 19:50