Aquí hay una guía aproximada para ajustar el codificador:
Comenzaremos por lo básico, ya que sería perjudicial llegar a la conclusión de que un aluvión rápido de opciones mejorará repentinamente la producción esperada sin comprender los objetivos y expectativas deseados:
1. Comience 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 eso estoy usando xclip para copiar las opciones de códec en el portapapeles antes de pegarlas aquí):
(un). Para el codificador H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Salida:
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....
(si). Para el codificador HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Salida:
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. Comprenda las limitaciones del hardware y cumpla con 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 codificaciones HEVC en Pascal.
Para ver la infraestructura acelerada por hardware disponible para el hardware NVIDIA de generación actual con FFmpeg, consulte esta respuesta.
Luego, utilizando esa información, continúe con el siguiente paso.
3. La sintaxis es crítica:
Aquí está el orden en que debe pasar los argumentos a FFmpeg:
(un). Llama el binario.
(si). Pase cualquier argumento a FFmpeg (como -loglevel
directamente) antes de declarar entradas.
(C). Si está utilizando una decodificación acelerada por hardware, como cuvid
declararla aquí e incluir cualquier argumento específico 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, determine y valide la necesidad de decodificadores acelerados por hardware como falla en esta etapa da como resultado 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.
(re). Declara tus aportes. Para las transmisiones, use la URL y, si es necesario, agregue banderas 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 cambiar el tamaño, conversaciones en formato de píxeles, desentrelazado, etc. Tenga en cuenta que, dependiendo del filtro que se use aquí, un decodificador basado en hardware (como se describe en la sección (c) introducirá restricciones de que su filtro debe ser capaz de manejar, o de lo contrario su codificación fallará.
(F). Llamar a los codificadores de vídeo y audio apropiados, y pasar argumentos necesarios para ellos, tales como asignaciones, tasas de bits, ajustes preestablecidos del codificador, etc. Cuando se trata de tasas de bits, asegúrese de que los valores deseados se establecen a través de los -b:v
, -maxrate:v
y -bufsize:v
opciones. No los deje en blanco. Este es un buen punto de partida sobre por qué son importantes estos valores. Como siempre, comience especificando un preset. Desplácese hacia abajo para ver notas sobre el impacto en el rendimiento de los preajustes con este codificador en particular.
(sol). 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 se puedan pasar opciones adicionales al muxer subyacente si es necesario , como suele ser el caso con los formatos de transmisión como HLS, MPEGS 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 las velocidades de bits adecuadas (a través de -b:v
, -maxrate:v
y la -bufsize:v
configuración), habilitando técnicas de codificación de cuantificación adaptativa (se admiten métodos AQ espaciales y temporales, de los cuales solo se puede usar uno a la vez) y de forma opcional (y por separado) habilitando la predicción ponderada (que deshabilitará el soporte de trama B) como se muestra a continuación, así como un filtro opcional para una reducción de escala adecuada y cambiar el tamaño si es necesario. El siguiente ejemplo muestra una entrada de mpegts de manejo de fragmentos 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. Intentar hacerlo resultará en una falla de inicialización del codificador.
El fragmento anterior supone que el archivo de entrada es una secuencia 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 las opciones de cuantificación adaptativa O de predicción ponderada para NVENC puede presentar problemas con la estabilidad, particularmente con combinaciones específicas de controladores de dispositivos. Siempre que sea posible, considere usar cuadros B (no más de 3) combinados con la opción genérica -refs:v
establecida en 16 o más, en lugar de alternar en 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 B-frames para referencia como se muestra a continuación (vea la palanca -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 recuento de hilos (pasado a ffmpeg a través de la -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 conteos de subprocesos más altos en modos de velocidad de bits constante y modo de velocidad de bits casi constante llamado VBV (verificador de búfer de video), debido a un mayor retraso de codificación. Los fotogramas clave necesitan más datos que otros tipos de fotogramas para evitar pulsos de fotogramas clave de baja calidad.
El modo de retardo cero o de subprocesos divididos no tiene retraso, 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 recuento de subprocesos en las codificaciones donde la latencia es importante, ya que el rendimiento percibido del codificador aumenta las ventajas que puede aportar a largo plazo.
Y dado que está en Windows, es posible que desee eliminar los escapes de shell \
anteriores, ya que estoy escribiendo esto desde un cuadro de Unix que prueba el comando anterior.
Notas sobre el impacto en el rendimiento con preajustes y consideraciones de codificación entrelazadas:
Para obtener un alto rendimiento y un rendimiento de baja latencia, asegúrese de usar uno llhp
o los llhq
valores predeterminados. Esto es más útil para las 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, se pueden omitir por completo las funciones paralizantes de rendimiento como los cuadros B para una buena compensación entre velocidades de bits más altas en uso y rendimiento. Los ajustes preestablecidos más altos (como el predeterminado medium
) tienen rendimientos decrecientes rápidamente en la salida de calidad y al mismo tiempo incurren en desaceleraciones significativas en el rendimiento del codificador. La diferencia de calidad entre llhp
y llhq
según lo medido por VMAF de Netflix es prácticamente insignificante, sin embargo, el aumento del rendimiento del codificador (más de ~ 30% en mi banco de pruebas) con el primero es definitivamente apreciable.
Para los ajustes preestablecidos llhp
y llhq
, así como otros ajustes preestablecidos en uso, también puede anular los métodos de control de velocidad incorporados pasando los -rc:v
argumentos expuestos por las opciones del codificador. Por ejemplo, con una codificación de velocidad 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 brinda un aumento adicional de ~ 20% al rendimiento). Tenga en cuenta que el valor predeterminado seleccionado tiene el mayor impacto en el rendimiento , seguido de las opciones predeterminadas (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 ajústelo 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 de la plataforma específica (como su GPU y versiones de controlador), etc.
Al mismo tiempo, tenga en cuenta que NVIDIA ha desactivado explícitamente la codificación entrelazada en Turing en todos los niveles, incluso en la línea 1660Ti que usa el codificador Volta NVENC más antiguo. Si necesita soporte de codificación entrelazada, cambie a SKU Pascal o anteriores en su lugar.