首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenGL和NVENC对GStreamer纹理进行编码?

使用OpenGL和NVENC对GStreamer纹理进行编码?
EN

Stack Overflow用户
提问于 2019-09-24 16:12:42
回答 1查看 2.1K关注 0票数 1

我有一个openGL应用程序,它将数据呈现为rgba纹理。我想用gstreamer框架(使用nvenc插件进行h264编码)对其进行编码和流。

为了解决这些问题,我仔细阅读了文档:

  1. 如何将应用程序的现有openGL上下文导出到nvenc元素。
  2. 如何将纹理标识传递给源?
  3. 同步将如何工作。也就是说,nvenc必须等待渲染完成,同样,应用程序也必须等待nvenc完成纹理的读取。我假设它将涉及使用同步栅栏或glMemoryBarriers。

任何示例代码都会非常有用。

我确实想避免任何纹理拷贝到cpu内存。Nvidia的NVENC提到它使用CUDA上下文进行调用,openGL纹理可以通过cudaGraphicsGLRegisterImage调用导入到CUDA上下文中。因此,我的期望是,从应用程序到视频编码帧可以做到没有任何副本。

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 02:44:59

我知道这是个老问题,但万一别人碰到这个问题.

  1. 如果您的NVENC调用和OpenGL应用程序处于同一线程中,则不需要对上下文进行任何操作。 如果没有,您可能应该创建两个OpenGL上下文,一个用于呈现,一个用于编码。正如上下文中所解释的那样,这两个上下文应该共享对象。 您还可以创建一个上下文并在线程之间传递上下文,方法是使其“当前”到正在访问OpenGL对象的线程,但我发现这两个上下文更容易。
  2. 纹理id是一个整数,只需传递它。
  3. NvEncMapInputResource“提供同步保证,在输入缓冲区上提交的任何图形或计算工作都在缓冲区用于编码之前完成”。NvEncEncodePicture具有“同步编码模式”。
  4. 到目前为止,NVENC在linux上支持OpenGL编码设备,所以您不必在CUDA中注册OpenGL纹理。NVENC可以直接访问OpenGL纹理,因此客户端没有内存副本。 如果您在windows上工作,我相信您可以创建一个CUDA编码设备,然后从一个OpenGL纹理中获得一个OpenGL,并且NVENC可以访问CUarray。

OpenGL和CUDA编码装置的样本代码可以在NVENC的样本中找到。

编辑:

NvEncMapInputResource的同步保证似乎只适用于单线程情况(还是在同一个GL上下文中?)。如果呈现和编码发生在不同的线程和上下文中,则必须在映射之前添加同步对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58084387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档