Есть ли способ превратить видеокадры из GStreamer в экземпляры SkImage для использования в Skia?

#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 .

В первом показано, как получить (в данном случае аудио) буферы из конвейера. Вы получите обратный вызов, вызываемый для каждого поступающего буфера. Затем вы можете либо

  1. извлеките их из обратного вызова и передайте их через какой-то канал в ваш код skia
  2. просто сообщите своему коду skia, что буфер доступен, а затем извлеките его из кода skia
  3. прямое извлечение из кода 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 еще не является частью привязок.