Aqui está um guia aproximado para ajustar o codificador:
Começaremos do básico, pois seria prejudicial concluir que uma rápida enxurrada de opções melhorará repentinamente a produção esperada 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 que cada codificador utiliza (observe que estou no Linux, é por isso que estou usando o xclip para copiar as opções de codec para a área de transferência antes de colá-las aqui):
(uma). Para o codificador H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Resultado:
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
Resultado:
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 atenha-se aos padrões saudáveis antes de aplicar as opções:
Consulte esta resposta para obter as limitações de hardware que você encontrará com o NVENC, especialmente para codificações HEVC no Pascal.
Para a infraestrutura acelerada por hardware disponível para o hardware NVIDIA da geração atual com FFmpeg, consulte esta resposta.
Em seguida, usando essas informações, prossiga para a próxima etapa.
3. A sintaxe é crítica:
Aqui está a ordem em que você deve passar argumentos para o FFmpeg:
(uma). Chame o binário.
b) Passe 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 os argumentos específicos que forem necessários. Nesse ponto, seria imperativo mencionar que os decodificadores têm restrições específicas, como resoluções de entrada esperadas, codecs suportados, etc. nesse estágio resulta em falha na codificação e é irrecuperável. De fato, os desenvolvedores de MPV mencionaram isso repetidamente , não confie na decodificação acelerada por hardware para entrega de conteúdo de missão crítica.
d) Declare suas entradas. Para fluxos, use a URL e, se necessário, acrescente 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 redimensionamento, conversas no 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) apresentará restrições que seu filtro deve ser capaz de lidar, ou então sua codificação falhará.
f) Acesse os codificadores de vídeo e áudio apropriados e transmita os argumentos necessários, como mapeamentos, taxas de bits, predefinições de codificadores, etc. Quando se trata de taxas de bits, verifique se os valores desejados estão definidos por meio de -b:v
,-maxrate:v
e -bufsize:v
opções. Não os deixe em branco. Este é um bom ponto de partida para a importância desses valores. Como sempre, comece especificando uma predefinição. Role para baixo até ver notas sobre o impacto no desempenho das predefinições com este codificador específico.
g) Enquanto o FFmpeg pode deduzir o formato de saída necessário de um arquivo, dependendo da extensão selecionada do arquivo de saída, é recomendável declarar explicitamente o formato de saída (através da opção -f) para que opções extras possam ser passadas ao muxer subjacente, se necessário , como geralmente acontece 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"
É possível aumentar a qualidade de saída, indicando taxas de bits apropriados (através do -b:v
, -maxrate:v
e -bufsize:v
configurações), permitindo que as técnicas de quantização de codificação adaptativas (métodos AQ espaciais e temporais são suportados, das quais apenas um pode ser usado de cada vez) e por, opcionalmente, (e separadamente) ativar a previsão ponderada (que desativará o suporte ao quadro B), como mostrado abaixo, bem como um filtro opcional para uma redução de escala adequada e redimensionar, se necessário. O exemplo abaixo mostra um snippet que manipula a entrada mpegts codificada em mpeg2:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Aviso: Observe que a previsão ponderada ( -weighted_pred
) não pode ser ativada ao mesmo tempo que a quantização adaptativa. Tentar fazer isso resultará em falha na inicialização do codificador.
O trecho acima pressupõe que o arquivo de entrada seja um fluxo MPEG2. Se não for esse o caso, alterne para o decodificador CUVID correto depois de analisá-lo:
ffprobe -i e:\input.ts
Se for 'H.264 / AVC, modifique o trecho conforme mostrado abaixo:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Percebi que ativar opções de quantização adaptativa OU de predição ponderada para NVENC pode apresentar problemas de estabilidade, principalmente com combinações específicas de drivers de dispositivo. Sempre que possível, considere usar quadros B (não mais que 3) combinados com a opção genérica -refs:v
definida como 16 ou aproximadamente, em vez de alternar no AQ e na previsão ponderada:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"
Com o Turing , em particular, você também pode se beneficiar da habilitação de quadros B para referência, como mostrado abaixo (consulte a alternância -b_ref_mode:v middle)
:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"
Uma observação extra sobre as contagens de threads (transmitidas ao ffmpeg através da -threads
opção):
Mais encadeamentos de codificador além de um determinado limite aumentam a latência e terão uma maior pegada na memória de codificação. A degradação da qualidade é mais proeminente com contagens mais altas de threads 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 maior atraso na codificação. Os quadros-chave precisam de mais dados do que outros tipos de quadros para evitar pulsar quadros-chave de baixa qualidade.
O atraso de zero ou o modo de segmento fatiado não possui atraso, mas essa opção piora ainda mais a qualidade de vários segmentos nos codificadores suportados.
Portanto, é aconselhável limitar a contagem de encadeamentos nos códigos em que a latência é importante, pois a taxa de transferência percebida do codificador aumenta as vantagens que ele pode trazer a longo prazo.
E, como você está no Windows, remova os escapes do shell \
acima, enquanto escrevo isso em uma caixa Unix testando o comando acima.
Notas sobre o impacto no desempenho com predefinições e considerações sobre codificação entrelaçada:
Para alta taxa de transferência, desempenho de baixa latência, verifique se você está usando uma llhp
ou mais llhq
predefinições. Isso é mais útil para cargas de trabalho, como transmissão ao vivo, em que é esperada uma compatibilidade mais ampla com uma variedade maior de dispositivos e, como tal, recursos prejudiciais ao desempenho, como quadros B, podem ser totalmente omitidos para uma boa troca entre taxas de bits mais altas. uso e taxa de transferência. Predefinições mais altas (como o padrão medium
) têm retornos rapidamente decrescentes na saída de qualidade e, ao mesmo tempo, incorrem em lentidão significativa na taxa de transferência do codificador. A diferença de qualidade entre llhp
e llhq
conforme medida pelo VMAF da Netflix é praticamente insignificante, mas o aumento no desempenho do codificador (acima de 30% na minha bancada de testes) com o primeiro é definitivamente apreciável.
Para as predefinições llhp
e llhq
, bem como outras predefinições em uso, você também pode substituir os métodos de controle de taxa incorporados passando os -rc:v
argumentos conforme expostos pelas opções do codificador. Por exemplo, com a codificação constante da taxa de bits, você pode especificar -rc:v cbr
(o que é significativamente mais rápido que o cbr_ld_hq
método de controle de taxa, trazendo um aumento adicional de ~ 20% na taxa de transferência). Observe que a predefinição selecionada tem o maior impacto na taxa de transferência , seguida pelas opções predefinidas (como o método de controle de taxa em uso) que você pode opcionalmente substituir, se desejar.
Considere o seu fluxo de trabalho de codificação e ajuste conforme necessário. Sua milhagem definitivamente variará, com base no conteúdo de origem, nas cadeias de filtros em uso, nas variáveis específicas da configuração da plataforma (como as versões de GPU e driver), etc.
No mesmo instante, observe que a NVIDIA desabilitou explicitamente a codificação entrelaçada em Turing em todas as camadas, mesmo na linha 1660Ti que usa o codificador Volta NVENC mais antigo. Se você precisar de suporte para codificação entrelaçada, alterne para Pascal ou SKUs mais antigos.