Red de conocimiento informático - Aprendizaje de programación - Aplicación práctica de decodificación física ffmpeg + cuda (cuvid) + conversión de formato de píxeles (dominada por CPU)

Aplicación práctica de decodificación física ffmpeg + cuda (cuvid) + conversión de formato de píxeles (dominada por CPU)

cuvid y VDPAU son igualmente importantes y no se pueden usar directamente porque el costo de uso es demasiado alto

Nota:

Nota

Nota: Para la edición de video para el decodificador SDK 7.0 y superior, se cambió el nombre de NVCUVID a NVDECODE API.

Esta es la primera vez que lo uso de una manera que simule la decodificación suave de la CPU (obteniendo cuadros de video y almacenándolos como bmp; por experiencia, esta es la forma más fácil)

< strong> Resultados de la ejecución:

Fallo, error del puntero src img

Los resultados de la ejecución son los siguientes:

Causa del problema:

gpu sws_scale + AV_PIX_FMT_CUDA->AV_PIX_FMT_BGR24 no es compatible. ¿Se puede convertir AV_PIX_FMT_CUDA directamente a AV_PIX_FMT_BGR24 en la gpu?

Si puede hacer esto directamente, el rendimiento mejorará enormemente, porque la transmisión de datos entre el dispositivo y el host se reduce, y la GPU tiene capacidades de procesamiento paralelo de múltiples núcleos y el rendimiento de procesamiento es Definitivamente mejor que la CPU.

Resultados de la ejecución:

Error, los píxeles no están alineados, solo brillo

Los resultados de la ejecución son los siguientes:

! [Preestablezca el formato de píxel de destino del cuadro en la memoria en AV_PIX_FMT_BGR24]

Causa del problema:

El resultado de la ejecución es como se muestra a continuación:

Entonces, la fuente gdb código, se encontró que src->frame->format se convirtió a dst->frame->format.gt; el rango límite de frame->format era muy pequeño, y luego se encontró el formato admitido por av_hwframe_transfer_get_formats

El proceso de depuración es el siguiente:

gdb -tui hw_decode_cuvid (-tui admite la visualización del código fuente)

Punto de interrupción al llamar a av_hwframe_transfer_data() y establecer los parámetros necesarios para ejecute el programa

Ejecute el programa e ingrese a la pila de funciones

Ejecute el programa e ingrese a la pila de funciones

n Operación de un solo paso, la función llama a transfer_data_alloc ()

Encontré la función av_hwframe_transfer_get_formats()

Cambie dst_transfer_formats() y establezca los parámetros necesarios para ejecutar el programa

Ejecute el programa. > Cambie el valor de dst->format a <0 e imprima la lista de conversión de píxeles admitidos

Puede ver que solo se admite la conversión al formato de codificación de píxeles del hardware gpu - >AV_PIX_FMT_NV12 -

Resultado de ejecución:

Resultado de ejecución:

Resultado de ejecución:

Resultado de ejecución:

Éxito, como se muestra en la siguiente figura :