我目前正在用媒体的GStreamer和图形的Skia(Vulkan(编写我自己的游戏引擎。有没有一种方法可以将视频帧从GStreamer转换为SkImage实例,以便在Skia中使用?
我在网上搜索了文档和解决方案,但我发现我可以通过fakesink
从GStreamer获得GstBuffer
。不确定这是否有任何帮助。
您基本上需要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以正确的格式为您提供数据,例如ARGB。app_sink.rs
示例通过在appsink
元素上设置上限来实现这一点,在您的情况下,您希望在那里设置相应的视频上限,以描述skia想要的格式。
该目录中另一个可能有用的示例是glupload.rs
示例。它使用appsink
来获得作为GL纹理的GStreamer缓冲区,然后通过glutin渲染它们。Vulkan也可能出现类似的情况,但目前GStreamer Vulkan库还不是绑定的一部分。