#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 не может найти плагины.