Para codificaciones basadas en CRF, pase los siguientes argumentos en el fragmento a continuación a FFmpeg:
-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high
Por supuesto, deberá ajustar las tasas de bits objetivo y un cq
valor fijo . 19 es la configuración recomendada ya que es 'visualmente idéntica a 0, pero conserva una buena compensación de compresión al tamaño del archivo. Vea este artículo para obtener más información sobre lo que hace CRF.
Tenga en cuenta que la -cq
escala es logarítmica, lo que significa que 0 es esencialmente sin pérdidas y 51 sería lo peor.
La calidad puede mejorarse aún más mediante la adición de opciones como cuadros B (limite esto a 3, como máximo, y esto requiere el perfil principal H.264 y superior. Los perfiles de línea de base no admiten cuadros B. Para hacer esto, pase -bf {uint}
a el codificador de video, de modo que -bf:v 4
resultaría en que el codificador use 4 cuadros B.
Las piezas clave son el -cq:v 19
y los -rc:v vbr_hq
argumentos, que le permiten ajustar el codificador tanto con una tasa de bits variable preestablecida y una tasa de bits máxima permisible ( -b:v
y -maxrate:v
) mientras que se adhiere a un valor de 19 CRF.
Y ahora, pequeñas notas sobre NVENC y su ajuste para codificaciones de alta calidad:
NVENC, como cualquier otro codificador basado en hardware, tiene varias limitaciones, y en particular con HEVC, estas son las limitaciones conocidas:
En Pascal:
Para codificaciones HEVC, se aplican las siguientes limitaciones:
- Los tamaños de CTU superiores a 32 no son compatibles.
- Los marcos B en HEVC tampoco son compatibles.
- Los formatos de textura admitidos por el codificador NVENC limitan los espacios de color con los que puede trabajar el codificador. Por ahora, tenemos soporte para 4: 2: 0 (8 bits) y 4: 4: 4 (para 10 bits). No se admiten formatos extraños como 4: 2: 2 de 10 bits. Esto afectará algunos flujos de trabajo donde se requieren dichos espacios de color.
- El control de anticipación también está limitado a 32 cuadros. Es posible que desee ver este editorial para obtener más detalles.
Turing tiene todas las mejoras disponibles para Pascal, con la adición de soporte de cuadro B para HEVC y la capacidad de usar cuadros B como referencia. Consulte esta respuesta para ver un ejemplo de esta capacidad.
Y en Maxwell Gen 2 (GPU de la serie GM200x):
La codificación HEVC carece de las siguientes características:
El impacto aquí para Maxwell es que las escenas con mucho movimiento con HEVC bajo tasas de bits restringidas pueden sufrir artefactos (bloqueos) debido a las funciones de búsqueda anticipada que faltan y las capacidades de filtrado de bucle de desplazamiento de muestra adaptable (SAO). Pascal ha mejorado algo esta capacidad, pero dependiendo de la versión del SDK con la que se construyó el codificador de video, es posible que no todas las funciones estén disponibles.
Por ejemplo, el modo de predicción ponderado para codificaciones H.264 en Pascal requiere NVENC SDK 8.0x y superior, y este modo de codificación también deshabilitará el soporte de trama B. Del mismo modo, la combinación de escaladores basados en hardware que se ejecutan con Nvidia Performance Primitives (NPP) con NVENC puede introducir mejoras de rendimiento con aplicaciones de escalado de video a costa de escalar artefactos, particularmente con contenido mejorado. Lo mismo también afecta la tubería de codificación de video ya que las funciones de escalado de NPP se ejecutan fuera de los núcleos CUDA en la GPU, y como tal, el impacto en el rendimiento introducido por la carga adicional debe analizarse caso por caso para determinar si la calidad del rendimiento la compensación es aceptable.
Tenga esto en cuenta: un codificador basado en hardware siempre ofrecerá una personalización algo menor que una implementación basada en software equivalente, y como tal, su kilometraje y calidad de salida aceptable siempre serán diferentes.
Y para su referencia:
Con FFmpeg, siempre puede consultar la configuración de un codificador para personalizarla:
ffmpeg -h encoder {encoder-name}
Entonces, para codificadores basados en NVENC, puede ejecutar:
ffmpeg -h encoder=hevc_nvenc
ffmpeg -h encoder=h264_nvenc
También puede ver todos los codificadores basados en NVENC y los escaladores basados en NPP (si está construido como tal) ejecutando:
for i in encoders decoders filters; do
echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done
Salida de muestra en mi banco de pruebas:
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
slow
afast
en tu primer comando. CRF no está implementado ennvenc
.