繁体   English   中英

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

[英]Get screenshot of EGL DRM/KMS application

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

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

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

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

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

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

这是一个非常有趣的问题,我从多个角度解决了这个问题。

问题非常复杂并且取决于平台,您似乎在 EGL 上运行,这意味着嵌入式,除非您的平台提供,否则您几乎没有选择。

您拥有的选项是:

glTexSubImage2D

glTexSubImage2D可以将多种缓冲区从 OpenGL 纹理复制到 CPU 内存。 不幸的是,GLES 2/3 不支持它,您的嵌入式提供商可能通过扩展支持它。 这很好,因为您可以渲染到 FBO 或从您需要的特定纹理中获取像素。 它还需要最少的代码交互。

读像素数

glReadPixels是下载已渲染的全部或部分 GPU 像素的最常用方法。 尽管速度很慢,但它适用于 GLES 和桌面。 在具有不错 GPU 的台式机上可以承受交互式帧速率,但要注意嵌入式它可能会慢,因为它会停止渲染线程以获取数据(确保可怕的掉帧)。 您可以保存代码,因为只需修改最少的代码即可使其工作。

像素缓冲区对象 (PBO)

一旦您开始进行真正的研究, PBO就会到处出现,因为它们可以异步工作。 它们通常也不受嵌入式支持,但即使在平庸的 GPU 上也可以在桌面上很好地工作。 设置也有点棘手,需要特定的渲染修改。

帧缓冲区

在嵌入时,有时你已经渲染到帧缓冲区,所以去那里获取像素。 也适用于桌面。 您可以将mmap()缓冲区封装到文件中并轻松获取部分内容。 但要注意,在许多嵌入式系统中,EGL 不适用于帧缓冲区,而是在不同的“覆盖”上工作,因此您可能会对其背景进行快照。 还要注意一些多媒体应用程序在 EGL 上运行 UI,在帧缓冲区上运行媒体播放器。 因此,如果您只需要捕获视频播放器,这可能适合您。 在其他情况下,有 EGL 目标是复制到帧缓冲区的纹理,它也可以正常工作。

据我所知渲染到纹理和流到帧缓冲区是他们制作你在Ableton Push 2上看到的甜美 Qt UI 的方式在此处输入图片说明

更多异国情调的 Dispmanx/OpenWF

在某些嵌入式系统(特别是 Raspberry Pi 和大多数 Broadcom Videocore 的)上,您有 DispmanX。 这真的很有趣

这很有趣:

访问 GPU 的最低级别似乎是通过名为 Dispmanx[...] 的 API

它继续...

只是为了让您完全缺乏使用 Dispmanx 的鼓励,几乎没有任何示例,也没有严肃的文档。

基本上 DispmanX 非常接近裸机。 所以它比帧缓冲区或 EGL 更深。 非常有趣的东西,因为您可以使用vc_dispmanx_snapshot()并真正快速地获得所有内容的快照。 快速我的意思是我获得了 30FPS RGBA32 屏幕捕获,屏幕上没有明显的卡顿,并且在 Rasberry Pi 上有大约 4% 到 6% 的额外 CPU 开销。 即使是 1x1 像素捕获,由于 glReadPixels 得到的日夜都会产生非常明显的掉帧。

这几乎就是我发现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM