¿Cómo puedo usar la codificación CRF con nvenc en ffmpeg?

22

Este es mi comando actual para cambiar el tamaño de los videos (1080p) de 2GB a 300MB, pero lleva mucho tiempo:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Probé nvenc con mi NVIDIA GTX1070:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

El tamaño de salida siempre es 3⨉ o 5⨉ del tamaño original; nvenc no lo utiliza -crf.

Entonces, ¿cómo uso nvenc con ffmpeg para convertir / redimensionar un video con alta calidad y tamaño pequeño? ¿Debo usar la GPU para codificar?

hongducwb
fuente
Puedes cambiar slowa fasten tu primer comando. CRF no está implementado en nvenc.
Gyan
El objetivo de NVENC es permitir la codificación de video en tiempo real (para cosas como las videollamadas); La calidad es una consideración subordinada.
CL.

Respuestas:

23

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 cqvalor 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 -cqescala 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 4resultaría en que el codificador use 4 cuadros B.

Las piezas clave son el -cq:v 19y los -rc:v vbr_hqargumentos, que le permiten ajustar el codificador tanto con una tasa de bits variable preestablecida y una tasa de bits máxima permisible ( -b:vy -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:

  1. 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.

  1. 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
林正浩
fuente
1
¡Gran respuesta! El wiki de ffmpeg en nvenc está un poco desactualizado y carece de toda esa información ... si tienes unos minutos, sería genial si pudieras aportar tus conocimientos allí: trac.ffmpeg.org/wiki/HWAccelIntro
slhck
1
gracias por la respuesta :) ffmpeg wiki necesita más respuestas como esta
hongducwb
Gracias por la respuesta. Buscaré agregar esto a la wiki de FFmpeg.
林正浩
salida de los archivos de colores parecen más oscuro, recuerdo una argumentos pueden controlar el color mismo como archivo de entrada
hongducwb
2
vbr_minqpparece estar en desuso ahora. Estoy de acuerdo en que esta respuesta podría malinterpretarse ya que no hay modo CRF para h264_nvenc.
slhck
4

Creo que encontré una solución:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Parece que h264_nvenc usa en -qplugar de -crf. Esta opción solo funciona mientras -rcestá configurado en constqp.

Alexander01998
fuente
1
No, -qpes todo diferente de -crf. h264_nvenc 's -qpes equivalente a libx264 ' s-qp
Miau
@Meow Eso es lo suficientemente cerca para mí, pero es bueno saber que hay una diferencia. Para cualquiera que pueda ver esto en el futuro, esta página explica la diferencia entre CRF y QP.
Alexander01998
3

Para el -crfreemplazo de libx264 puede ser -cqo -qpdesde h264_nvenc:

-crf Seleccione la calidad para el modo de calidad constante

-cq Establezca el nivel de calidad objetivo (0 a 51, 0 significa automático) para el modo de calidad constante en el control de velocidad VBR

-qp Método de control de velocidad de parámetros de cuantificación constante (de -1 a 51) (predeterminado -1)

Método de codificación acelerado por hardware más rápido:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizeresolución en entrada (en hardware); no es necesario compilar ffmpeg --enable-libnpppara el scale_nppfiltro.

Para más información:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
a B C
fuente