Доступ к выводу gstreamer на GPU

#python #video #gstreamer

Вопрос:

Я работаю с Gstreamer и Python для декодирования видео с использованием ускорения HW на графическом процессоре Nvidia:

 rtspsrc ! rtph264depay ! h264parse ! nvh264dec ! videoconvert ! appsink
 

К следующему конвейеру можно получить доступ с помощью OpenCV, который вернет массив numpy. Однако, поскольку мне нужно обработать результирующий фрейм на графическом процессоре, мне было интересно, есть ли какой-либо компонент, который я могу использовать для замены appsink , который позволил бы мне получить доступ к фрейму непосредственно на графическом процессоре, используя любую библиотеку cuda (например cupy , pycuda ).

Ответ №1:

appsink не следует принудительно загружать память на хост. Но videoconvert , тем не менее, текстура будет загружена в память хоста.

Используйте что-то вроде этого:

 rtspsrc ! rtph264depay ! h264parse ! nvh264dec ! glcolorconvert ! appsink
 

Вы должны получить буферы с заглавными video/x-raw(memory:GLMemory) буквами в appsink then.

Если вы не хотите загружать текстуру, вы, вероятно, не сможете использовать обычные функции отображения буфера в этих буферах. Но я думаю, вы можете продолжить работу с функциями библиотеки GstGL:

https://gstreamer.freedesktop.org/documentation/gl/index.html?gi-language=c

Комментарии:

1. Спасибо за конвейер выше. Знаете ли вы, есть ли какой-либо способ получить доступ к appsink с GLMemory помощью Python?

2. Я не знаю, что это под рукой, но весь API Gstreamer C должен иметь эквивалентные привязки Python. В любом из документов вы также можете переключить язык на Python.

3. Есть ли руководство по установке плагинов OpenGL для GStreamer? Установите их с помощью apt, но я думаю, мне нужно экспортировать некоторый путь, потому что мой Gstreamer не может найти плагины.