2

我想编写由 OpenGLES2 渲染视频的 gstreamer 管道。我的第一个实现是 gstreamer appsink,它使 glTexSubImage2D() 写入纹理,然后渲染。它有效,但速度极慢。OpenGLES2 glTexSubImage2D() 是一个非常慢的函数。

我知道有一个特殊的 glimagesink 用于这些目的,但它需要 Window Id 来进行渲染,这不是我想要的。

我需要 gstreamer 将视频帧推送到 OpenGLES2 纹理,然后我将使用我自己的 OpenGLES2 着色器使用我自己的变换和转换等来渲染它。

我可以为 3 个 YUV 平面创建 3 个 DMABUF 内存区域,其中映射了 Y、U 和 V 的 3 个纹理。CPU 写入 DMABUF 内存区域,数据出现在 GPU 纹理中。

所以我希望gstreamer(在硬件视频解码之后)只是将准备好的帧写入我的内存指针。但是如何做到这一点?

我可以编写自己的 gstreamer 应用程序池,它将帧复制到我的 DMABUF 指针,但这是我想避免的额外副本。

有一些关于 gstreamer 零副本的精彩演示甚至 youtube 视频可以显示,但没有详细信息,也没有代码示例,如何开始?

我已经阅读了所有互联网,但找不到合适的起点。有人可以给我建议吗?

4

0 回答 0