Saltar al contenido

La mejor configuración para FFMpeg con NVENC

Hola, hemos encontrado la solución a lo que estabas buscando, continúa leyendo y la encontrarás un poco más abajo.

Solución:

Aquí hay una guía aproximada para ajustar el codificador:

Comenzaremos desde lo básico, ya que sería perjudicial llegar a la conclusión de que un aluvión rápido de opciones mejorará repentinamente el resultado esperado sin comprender los objetivos y expectativas deseados:

1. Empiece por comprender las opciones del codificador.

Para los codificadores basados ​​en NVENC, comience por aprender las opciones que toma cada codificador (tenga en cuenta que estoy en Linux, por lo que estoy usando xclip para copiar las opciones del códec en el portapapeles antes de pegarlas aquí):

(a). Para el codificador H.264:

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

Producción:

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                    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                   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                     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                        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              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       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                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt               E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               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                      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                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder                     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 el codificador HEVC / H.265:

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

Producción:

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                    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                   E..V.... Set the encoding profile (from 0 to 4) (default main)
     main                         E..V.... 
     main10                       E..V.... 
     rext                         E..V.... 
  -level                     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                      E..V.... Set the encoding tier (from 0 to 1) (default main)
     main                         E..V.... 
     high                         E..V.... 
  -rc                        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              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       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                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal_aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               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                      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                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

2. Comprenda las limitaciones del hardware y apéguese a los valores predeterminados antes de aplicar las opciones:

Consulte esta respuesta para conocer las limitaciones de hardware con las que se encontrará con NVENC, especialmente para las codificaciones HEVC en Pascal.

Para conocer la infraestructura acelerada por hardware disponible para el hardware NVIDIA de la generación actual con FFmpeg, consulte esta respuesta.

Luego, usando esa información, continúe con el siguiente paso.

3. La sintaxis es fundamental:

Aquí está el orden en el que debe pasar argumentos a FFmpeg:

(a). Llame al binario.

(B). Pase cualquier argumento a FFmpeg (como -loglevel directamente) antes de declarar las entradas.

(C). Si está utilizando una decodificación acelerada por hardware, como cuvid, declararlo aquí e incluir los argumentos específicos que requiera. En este punto, sería imperativo mencionar que los decodificadores tienen restricciones específicas, como resoluciones de entrada esperadas, códecs compatibles, etc., y como tal, se recomienda que en producción, para determinar y validar la necesidad de decodificadores acelerados por hardware como falla en esta etapa resulta en una codificación fallida y es irrecuperable. De hecho, los desarrolladores de MPV han mencionado esto repetidamente, no confíe en la decodificación acelerada por hardware para la entrega de contenido de misión crítica.

(D). Declare sus entradas. Para las transmisiones, use la URL y, si es necesario, anteponga indicadores adicionales (como tamaños de búfer) según sea necesario. Para los recursos locales (en un sistema de archivos accesible), se necesita la ruta absoluta del archivo.

(mi). Opcionalmente, inserte un filtro. Esto es necesario para funciones como cambio de tamaño, conversaciones de formato de píxeles, desentrelazado, etc. Tenga en cuenta que, según el filtro que se use aquí, un decodificador basado en hardware (como se describe en la sección (c) introducirá restricciones que su filtro debe ser capaz de manejar, o su codificación fallará.

(F). Llame a los codificadores de vídeo y audio adecuados y páseles los argumentos necesarios, como asignaciones, tasas de bits, ajustes preestablecidos de codificadores, etc. Cuando se trata de tasas de bits, asegúrese de que los valores deseados estén configurados mediante -b:v, -maxrate:v y -bufsize:v opciones. No los deje en blanco. Este es un buen punto de partida sobre la importancia de estos valores. Como siempre, comience especificando un ajuste preestablecido. Desplácese hacia abajo para ver notas sobre el impacto en el rendimiento de los ajustes preestablecidos con este codificador en particular.

(gramo). Mientras que FFmpeg puede deducir el formato de salida requerido de un archivo dependiendo de la extensión seleccionada del archivo de salida, se recomienda declarar explícitamente el formato de salida (a través de la opción -f) para que las opciones adicionales se puedan pasar al muxer subyacente si es necesario , como suele ser el caso con formatos de transmisión como HLS, mpegts y DASH.

(h). La ruta absoluta al archivo de salida.

Con su ejemplo anterior, citado como:

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

Puede aumentar la calidad de salida especificando tasas de bits adecuadas (a través del -b:v,-maxrate:v y -bufsize:v configuraciones), habilitando técnicas de codificación de cuantificación adaptativa (se admiten los métodos AQ espaciales y temporales, de los cuales solo se puede usar uno a la vez) y habilitando opcionalmente (y por separado) la predicción ponderada (que deshabilitará el soporte de cuadros B) como se muestra a continuación , así como un filtro opcional para reducir la escala y cambiar el tamaño si es necesario. El siguiente ejemplo muestra un fragmento que maneja la entrada mpegts codificada en 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"

Advertencia: Tenga en cuenta que la predicción ponderada (-weighted_pred) no se puede habilitar al mismo tiempo que la cuantificación adaptativa. Si intenta hacerlo, se producirá una falla en la inicialización del codificador.

El fragmento de código anterior asume que el archivo de entrada es un flujo MPEG2. Si ese no es el caso, cambie al decodificador CUVID correcto después de analizarlo:

ffprobe -i e:input.ts

Si es ‘H.264 / AVC, modifique el fragmento como se muestra a continuación:

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"

He notado que habilitar la cuantificación adaptativa O las opciones de predicción ponderada para NVENC puede presentar problemas de estabilidad, particularmente con combinaciones específicas de controladores de dispositivos. Siempre que sea posible, considere usar marcos B (no más de 3) combinados con la opción genérica -refs:v establecido en 16 o más o menos, en lugar de alternar entre AQ y predicción 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"

Con Turing, en particular, también puede beneficiarse de habilitar los marcos B como referencia, como se muestra a continuación (consulte el botón de alternancia -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"

Una nota adicional sobre el número de subprocesos (pasada a ffmpeg a través del -threads opción):

Más subprocesos de codificador más allá de un cierto umbral aumenta la latencia y tendrá una mayor huella de memoria de codificación. La degradación de la calidad es más prominente con un mayor número de subprocesos en los modos de tasa de bits constante y el modo de tasa de bits casi constante llamado VBV (verificador de búfer de video), debido a un mayor retardo de codificación. Los fotogramas clave necesitan más datos que otros tipos de fotogramas para evitar la pulsación de fotogramas clave de baja calidad.

El modo de retardo cero o de subprocesos cortados no tiene retardo, pero esta opción empeora aún más la calidad de subprocesos múltiples en los codificadores compatibles.

Por lo tanto, es aconsejable limitar el número de subprocesos en las codificaciones donde la latencia importa, ya que el aumento del rendimiento del codificador percibido compensa cualquier ventaja que pueda brindar a largo plazo.

Y dado que está en Windows, es posible que desee eliminar los escapes de shell arriba mientras escribo esto desde un cuadro de Unix probando el comando anterior.

Notas sobre el impacto en el rendimiento con ajustes preestablecidos y consideraciones de codificación entrelazada:

Para un alto rendimiento y un rendimiento de baja latencia, asegúrese de utilizar llhp o llhq Preajustes. Esto es más útil para cargas de trabajo, como la transmisión en vivo, donde se espera una compatibilidad más amplia con una variedad más amplia de dispositivos y, como tal, las características que paralizan el rendimiento, como los marcos B, se pueden omitir por completo para lograr un buen equilibrio entre tasas de bits más altas en uso y rendimiento. Ajustes preestablecidos más altos (como los predeterminados medium) tienen rendimientos que disminuyen rápidamente en la salida de calidad y, al mismo tiempo, incurren en una ralentización significativa en el rendimiento del codificador. La diferencia de calidad entre llhp y llhq según lo medido por el VMAF de Netflix es prácticamente insignificante, sin embargo, el aumento de rendimiento del codificador (más de ~ 30% en mi banco de pruebas) con el primero es definitivamente apreciable.

Para el llhp y llhq preajustes, así como otros preajustes en uso, también puede anular los métodos de control de velocidad incorporados pasando el -rc:v argumentos expuestos por las opciones del codificador. Por ejemplo, con codificación de tasa de bits constante, puede especificar -rc:v cbr (que es significativamente más rápido que el cbr_ld_hq método de control de velocidad, lo que aporta un aumento adicional de ~ 20% al rendimiento). Tenga en cuenta que el preajuste seleccionado tiene el mayor impacto en el rendimiento, seguido de las opciones preestablecidas (como el método de control de velocidad en uso) que puede anular opcionalmente si lo desea.

Considere su flujo de trabajo de codificación y ajuste según sea necesario. Su kilometraje definitivamente variará, según su contenido de origen, las cadenas de filtros en uso, las variables de configuración específicas de la plataforma (como su GPU y las versiones del controlador), etc.

Al mismo tiempo, tenga en cuenta que NVIDIA ha deshabilitado explícitamente la codificación entrelazada en Turing en todos los niveles, incluso el 1650 usa el codificador Volta NVENC más antiguo. Si necesita compatibilidad con codificación entrelazada, cambie a Pascal o SKU anteriores.

Mi experiencia con el uso de nvenc es que debe decirle qué tasa de bits desea; el valor predeterminado es VBR, lo cual está bien, pero ninguna cantidad de ajuste compensa el hecho de que siempre quiere darle una tasa de bits promedio de 2M sin importar qué archivo de resolución lo alimenta. Parece una falla en el codificador; funciona de manera predecible en todos los demás aspectos, pero necesita (por ejemplo) -b:v 4M para un archivo de 720p o -b:v 8M para 1080p. Probablemente también puedas bajarlos un poco si lo deseas.

Agradecemos que desees asentar nuestra tarea mostrando un comentario o puntuándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *