有没有办法可以将视频帧从 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 发出的信号获得 GstBuffer
s。不确定这是否有任何帮助。
您基本上需要 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 映射 gst::Buffer
并访问原始视频数据。那应该允许你以某种方式将它传递给 skia。我不知道 skia 是如何工作的,所以你必须自己弄清楚那部分。
您还需要确保 GStreamer 以正确的格式为您提供数据,例如RGB。 app_sink.rs
示例通过在 appsink
元素上设置上限来实现,在您的情况下,您希望在那里设置相应的视频上限,以描述 skia 想要的格式。
该目录中的另一个可能有用的示例是 glupload.rs
示例。它使用 appsink
获取 GStreamer 缓冲区作为 GL 纹理,然后通过 glutin 渲染它们。 Vulkan 也可以实现类似的功能,但目前 GStreamer Vulkan 库还不是绑定的一部分。
我目前正在编写自己的游戏引擎,使用 GStreamer 用于媒体,使用 Skia (Vulkan) 用于图形。有没有办法可以将视频帧从 GStreamer 转换为 SkImage 实例以在 Skia 中使用?
我在网上搜索了文档和解决方案,但我发现我可以通过 fakesink
从 GStreamer 发出的信号获得 GstBuffer
s。不确定这是否有任何帮助。
您基本上需要 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 映射 gst::Buffer
并访问原始视频数据。那应该允许你以某种方式将它传递给 skia。我不知道 skia 是如何工作的,所以你必须自己弄清楚那部分。
您还需要确保 GStreamer 以正确的格式为您提供数据,例如RGB。 app_sink.rs
示例通过在 appsink
元素上设置上限来实现,在您的情况下,您希望在那里设置相应的视频上限,以描述 skia 想要的格式。
该目录中的另一个可能有用的示例是 glupload.rs
示例。它使用 appsink
获取 GStreamer 缓冲区作为 GL 纹理,然后通过 glutin 渲染它们。 Vulkan 也可以实现类似的功能,但目前 GStreamer Vulkan 库还不是绑定的一部分。