我正在考虑使用多个独立流程在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,这开始有点硬核。
答案 0 :(得分:0)
已经有一段时间了,但我终于使用OpenGL纹理和多线程整理了它。这似乎是最佳方式:
https://elsampsa.github.io/valkka-core/html/process_chart.html
(免责声明:我这样做了)