获取 EGL DRM/KMS 应用程序的屏幕截图

Ori*_*ent 6 linux opengl ubuntu qt egl

如何以编程方式获取图形应用程序的屏幕截图?应用程序通过 DRM/KMS 使用 EGL API 绘制其窗口。

我使用 Ubuntu Server 16.04.3 和使用 Qt 5.9.2 和 EGLFS QPA 后端编写的图形应用程序。它从第一个虚拟终端(如果重要)开始,然后以全高清图形模式将显示切换到输出。

当我使用fb2png在 上运行的实用程序(例如)时/dev/fb?,只有第一个虚拟终端 ( Ctrl+Alt+F1) 的文本模式内容会保存为屏幕截图。

几乎没有 EGL API 可以从另一个进程的上下文中获取任何缓冲区的内容(这将是不安全的),但是也许有某种机制(和库)可以访问 GPU 的最终输出?

Tho*_*ire 4

  1. 一种方法是从应用程序内获取屏幕截图,使用 读取后台缓冲区的内容glReadPixels()。或者使用QQuickWindow::grabWindow(),它在内部glReadPixels()以正确的方式使用。这似乎不适合您,因为您需要在 Qt 应用程序冻结时截取屏幕截图。

  2. 另一种方法是使用 DRM API 映射帧缓冲区,然后memcpy映射像素。这是在 Chromium OS 中使用 Python 实现的,可以轻松转换为 C,请参阅https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/367611。DRM API 也可以由执行渲染的 Qt UI 进程以外的其他进程使用。