使用Linux的大量实时视频流

时间:2017-02-09 14:51:39

标签: linux opengl x11 glx

我正在考虑使用多个独立流程在linux / X11中将大量实时视频流式传输到屏幕的不同方法。

我最初使用openGL / GLX和openGL纹理开始了这个项目,但那是一个死胡同。原因是:"上下文切换"。事实证明,当几个(独立的多个)进程使用多个上下文以快节奏纹理进行操作时(尤其是nvidia)表现不佳。这会导致崩溃,冻结等。

(参见以下主题:https://lists.freedesktop.org/archives/nouveau/2017-February/027286.html

我终于变成了Xvideo,它看起来效果非常好。我的初步测试表明,Xvideo处理视频转储的效率比openGL高10倍,并且不会崩溃。可以用720p @ 25fps演示运行~10 vlc客户端并尝试Xvideo和OpenGL输出(记得全屏全屏)。

然而,我怀疑Xvideo在引擎盖下使用openGL,所以让我们看看我是否正确行事......

Xvideo和GLX都是X11的扩展模块,但是:

(A)通过Xvideo倾倒视频:

  • XVideo将整个屏幕视为设备端口并直接对其进行操作(它具有这些类似上帝的能力,是X11的扩展)

  • ..所以它只需要来自图形驱动程序的单个上下文。让我们称之为上下文1。

  • 进程1请求特定窗口的Xvideo服务.Xvideo使用上下文1将其管理到屏幕的某个部分。

  • 进程2请求特定窗口的Xvideo服务.Xvideo使用上下文1将其管理到屏幕的某个部分。

(B)倾倒视频"手动"通过GLX和openGL纹理转储:

  • 进程1从glx请求上下文,获取上下文1并开始使用它转储纹理。

  • 进程2从glx请求上下文,获取上下文2并开始使用它转储纹理。

我说得对吗?

有没有办法直接使用openGL实现情况(A)?
..人们可能不得不完全放弃GLX,这开始有点硬核。

1 个答案:

答案 0 :(得分:0)

已经有一段时间了,但我终于使用OpenGL纹理和多线程整理了它。这似乎是最佳方式:

https://elsampsa.github.io/valkka-core/html/process_chart.html

(免责声明:我这样做了)