有没有办法可以将视频帧从 GStreamer 转换为 SkImage 实例以在 Skia 中使用?

Is there a way I can turn video frames from GStreamer to SkImage instances to be used in Skia?

我目前正在编写自己的游戏引擎,使用 GStreamer 用于媒体,使用 Skia (Vulkan) 用于图形。有没有办法可以将视频帧从 GStreamer 转换为 SkImage 实例以在 Skia 中使用?

我在网上搜索了文档和解决方案,但我发现我可以通过 fakesink 从 GStreamer 发出的信号获得 GstBuffers。不确定这是否有任何帮助。

您基本上需要 app_sink.rsapp_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 映射 gst::Buffer 并访问原始视频数据。那应该允许你以某种方式将它传递给 skia。我不知道 skia 是如何工作的,所以你必须自己弄清楚那部分。

您还需要确保 GStreamer 以正确的格式为您提供数据,例如RGB。 app_sink.rs 示例通过在 appsink 元素上设置上限来实现,在您的情况下,您希望在那里设置相应的视频上限,以描述 skia 想要的格式。

该目录中的另一个可能有用的示例是 glupload.rs 示例。它使用 appsink 获取 GStreamer 缓冲区作为 GL 纹理,然后通过 glutin 渲染它们。 Vulkan 也可以实现类似的功能,但目前 GStreamer Vulkan 库还不是绑定的一部分。