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 :