#rust #gstreamer #vulkan #gstreamer-1.0 #skia
#Ржавчина #gstreamer #vulkan #gstreamer-1.0 #skia
Вопрос:
В настоящее время я пишу свой собственный игровой движок с использованием GStreamer для мультимедиа и Skia (Vulkan) для графики. Есть ли способ превратить видеокадры из GStreamer в экземпляры SkImage для использования в Skia?
Я искал в Интернете документацию и решения, но все, что я нашел, это то, что я могу получить GstBuffer
s через сигнал от GStreamer fakesink
. Не уверен, что это поможет.
Ответ №1:
Вам в основном нужна комбинация app_sink.rs
и app_src.rs
пример из https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/tree/master/examples/src/bin .
В первом показано, как получить (в данном случае аудио) буферы из конвейера. Вы получите обратный вызов, вызываемый для каждого поступающего буфера. Затем вы можете либо
- извлеките их из обратного вызова и передайте их через какой-то канал в ваш код skia
- просто сообщите своему коду skia, что буфер доступен, а затем извлеките его из кода skia
- прямое извлечение из кода skia: это будет блокироваться до тех пор, пока не будет доступен буфер
Во втором показано, как использовать gst_video::VideoFrame
API для сопоставления a gst::Buffer
и доступа к необработанным видеоданным. Это должно позволить вам каким-то образом передать его в skia. Я не знаю, как работает skia, поэтому вам придется разобраться с этой частью самостоятельно.
Вам также нужно будет убедиться, что GStreamer предоставляет вам данные в правильном формате, например ARGB. В app_sink.rs
примере это делается путем установки заглавных букв для appsink
элемента, и в вашем случае вы хотите установить соответствующие заглавные буквы для видео, которые описывают формат, который хотел бы иметь skia.
Другим примером в этом каталоге, который может быть полезен, является glupload.rs
пример. Это использует an appsink
для получения буферов GStreamer в виде текстуры GL, а затем отображает их через glutin. Нечто подобное также было бы возможно с Vulkan, но в настоящее время библиотека GStreamer Vulkan еще не является частью привязок.