我正在开发一个工具,使用GL将视频中的帧渲染到纹理贴图网格上。我已经有一个GL应用程序与一个单一的图像(PNG)工作。现在我正在尝试使用gstreamer来解码视频。
我从appsink example开始。
我已经把解码后的视频通过glupload
传输到了一个appsink中。现在我需要将从appsink.pull_sample().get_buffer()
得到的BufferRef
转换为GL纹理id(u32
),以便将其传递给gl::BindTexture(gl::TEXTURE_2D, tex)
等GL函数。我在appsink上使用了set_caps()
,以确保缓冲区具有memory:GLMemory
功能,因此它最好是一个纹理,而不是脱离GPU。
如何使用Rust的gstreamer
和gstreamer-*
crate从BufferRef
中提取GL纹理id?
2条答案
按热度按时间oiopk7p51#
在C中从
GstGLMemory
检索纹理需要用特殊的GST_MAP_GL
标志MapGstGLMemory
本身。用于MapOpenGL纹理的特定接口目前还没有类似的rust。在https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/581中的相关领域中有一些工作可以帮助改善在rust中使用GStreamer OpenGL的情况。如果您只需要对纹理进行可读访问,那么
VideoFrame
上有一个扩展traitVideoFrameGLExt
,可以访问OpenGL纹理。https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/master/examples/src/bin/glupload.rs提供的gstreamer-rs
存储库中的glupload示例中有VideoFrameGLExt
的用法。VideoFrameGLExt
trait当前在https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/master/gstreamer-gl/src/gl_video_frame.rs中实现下面的代码应该适用于只读访问:
字符集
如果您还需要写入纹理,则当前未公开,并且需要写入手动绑定。
dfty9e192#
这些天我使用的代码是
字符集
虽然来自YStreet00的解决方案工作得很好,如果您可以方便地访问
gst::VideoInfo
的话。