Melhores configurações para o FFMpeg com NVENC

13

Estou usando meu FFMPEG com o suporte da minha GPU ( NVENC ) para converter arquivos do meu receptor de satélite (SD, mpeg2 .TS-Files) em h264 .mp4-files

Aqui está a linha que estou usando

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Mas a qualidade não é tão boa quanto esperada. E o poder total do meu sistema não é usado:

Apenas11%deGPUe30%deusodaCPU.

Pergunta:HáalgumasmelhoriasquepossofazerparamelhoraraqualidadeemtamanhodearquivoigualeusarmaispoderdecálculodaminhaGeforceGTX1080?

Encontreialguns parâmetros de 林正浩 para alterar, mas -preset slow já deveria ser a melhor abordagem de qualidade, certo?

    
por Dr. Snail 19.02.2018 / 15:11

2 respostas

13

Aqui está um guia aproximado para ajustar o codificador:

Começaremos do básico, pois é "prejudicial concluir que uma rápida enxurrada de opções melhorará de repente o resultado esperado sem entender os objetivos e expectativas desejados:

1. Comece entendendo as opções do codificador.

Para codificadores baseados em NVENC, comece aprendendo as opções de cada codificador (Observe que estou no Linux, e é por isso que estou usando o xclip para copiar as opções do codec para a área de transferência antes de colá-las aqui):

(a). Para o codificador H.264:

ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip

Saída:

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset            <int>        E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... 
     losslesshp                   E..V.... 
  -profile           <int>        E..V.... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
     high444p                     E..V.... 
  -level             <int>        E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     1b                           E..V.... 
     1.0b                         E..V.... 
     1.1                          E..V.... 
     1.2                          E..V.... 
     1.3                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     2.2                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     3.2                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     4.2                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
  -rc                <int>        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V.... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V.... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay             <int>        E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt           <boolean>    E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq        <boolean>    E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq       <boolean>    E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V.... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V.... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder             <int>        E..V.... Coder type (from -1 to 2) (default default)
     default                      E..V.... 
     auto                         E..V.... 
     cabac                        E..V.... 
     cavlc                        E..V.... 
     ac                           E..V.... 
     vlc                          E..V.... 

(b). Para o codificador HEVC / H.265:

ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip

Saída:

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
  -preset            <int>        E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... lossless
     losslesshp                   E..V.... lossless hp
  -profile           <int>        E..V.... Set the encoding profile (from 0 to 4) (default main)
     main                         E..V.... 
     main10                       E..V.... 
     rext                         E..V.... 
  -level             <int>        E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
     5.2                          E..V.... 
     6                            E..V.... 
     6.0                          E..V.... 
     6.1                          E..V.... 
     6.2                          E..V.... 
  -tier              <int>        E..V.... Set the encoding tier (from 0 to 1) (default main)
     main                         E..V.... 
     high                         E..V.... 
  -rc                <int>        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V.... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V.... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay             <int>        E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq        <boolean>    E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal_aq       <boolean>    E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V.... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V.... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

2. Entenda as limitações do hardware e mantenha os padrões antes de aplicar as opções:

Consulte esta resposta para as limitações de hardware que você encontrará com o NVENC, especialmente para codificações HEVC no Pascal.

Em seguida, usando essas informações, prossiga para a próxima etapa.

3. A sintaxe é fundamental:

Aqui está a ordem em que você tem que passar argumentos para o FFmpeg:

(a). Chame o binário.

(b). Passar quaisquer argumentos para o FFmpeg (como -loglevel diretamente) antes de declarar entradas.

(c). Se você estiver usando qualquer decodificação acelerada por hardware, como cuvid , declare-a aqui e inclua quaisquer argumentos específicos necessários. Neste ponto, seria imperativo mencionar que os decodificadores têm restrições específicas, como as resoluções de entrada esperadas, codecs suportados, etc, e como tal, é recomendado que, na produção, desabilite os decodificadores acelerados por hardware, pois a falha nesta etapa resulta em uma codificação com falha e é irrecuperável. Na verdade, os desenvolvedores de MPV têm mencionado isso repetidamente, não confie na decodificação acelerada por hardware para a missão. entrega de conteúdo crítico.

(d). Declare suas entradas. Para fluxos, use o URL e, se necessário, insira sinalizadores extras (como tamanhos de buffer) conforme necessário. Para recursos locais (em um sistema de arquivos acessível), o caminho absoluto do arquivo é necessário.

(e). Opcionalmente, insira um filtro. Isso é necessário para funções como redimensionar, conversas em formato de pixel, desentrelaçamento, etc. Observe que, dependendo do filtro em uso aqui, um decodificador baseado em hardware (conforme descrito na seção (c) introduzirá restrições que seu filtro deve ser capaz de manipular, senão seu codificador falhará.

(f) Chame os codificadores de vídeo e áudio apropriados e passe os argumentos necessários para eles, como mapeamentos, taxas de bits, predefinições de codificador, etc.

(g). Enquanto o FFmpeg pode deduzir o formato de saída requerido de um arquivo dependendo da extensão selecionada do arquivo de saída, é recomendado declarar explicitamente o formato de saída (através da opção -f) para que opções extras possam ser passadas para o muxer se necessário, como é frequentemente o caso com formatos de streaming como HLS, mpegts e DASH.

(h) O caminho absoluto para o arquivo de saída.

Com o seu exemplo acima, citado como:

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Você pode aumentar a qualidade de saída compensando uma taxa de bits mais alta, habilitando técnicas de codificação de quantificação adaptativa (métodos AQ espaciais e temporais são suportados e apenas um pode ser usado por vez e observe que isso também desativa o suporte de quadro B ) e, opcionalmente, permitindo técnicas de previsão ponderadas, como mostrado abaixo, bem como um filtro opcional para um downscale adequado e redimensionar se necessário:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"

O snippet acima supõe que o arquivo de entrada é um fluxo MPEG2. Se não for esse o caso, mude para o decodificador CUVID correto depois de analisá-lo:

ffprobe -i e:\input.ts

Se for 'H.264 / AVC, modifique o snippet como mostrado abaixo:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"

Uma nota extra sobre a contagem de threads (passada para o ffmpeg por meio da opção -threads ):

Mais encadeamentos de encoder além de um certo limite aumentam a latência e terão uma pegada de memória de codificação maior. A degradação da qualidade é mais proeminente com contagens de threads mais altas nos modos de taxa de bits constante e no modo de taxa de bits quase constante chamado VBV (verificador de buffer de vídeo), devido ao aumento do atraso de codificação. Os quadros-chave precisam de mais dados do que outros tipos de quadros para evitar a pulsação de quadros-chave de baixa qualidade.

O modo de atraso zero ou de linha fatiada não tem atraso, mas essa opção piora a qualidade de vários segmentos em codificadores compatíveis.

Portanto, é sensato limitar a contagem de threads em codificações onde a latência é importante, já que a taxa de transferência percebida do codificador aumenta as compensações que podem trazer a longo prazo.

E como você está no Windows, talvez queira remover as fugas do shell \ acima, pois estou escrevendo isso em uma caixa do Unix testando o comando acima.

    
por 20.02.2018 / 02:04
0

Minha experiência com o uso do nvenc é que você precisa dizer qual bitrate você quer - o padrão é VBR, o que é bom, mas nenhum ajuste compensa o fato de que sempre quer dar uma média de 2M taxa de bits não importa qual arquivo de resolução você alimente. Parece uma falha no codificador; ele executa de maneira previsível em todos os outros aspectos, mas precisa (por exemplo) -b:v 4M para um arquivo 720p ou -b:v 8M para 1080p. Você provavelmente poderia diminuir isso um pouco se quiser também.

    
por 23.10.2018 / 19:51