2017-11-22 3 views
1

그래픽 응용 프로그램의 스크린 샷을 프로그래밍 방식으로 가져 오는 방법은 무엇입니까? 응용 프로그램은 DRM/KMS를 통해 EGL API를 사용하여 창을 그립니다.EGL DRM/KMS 응용 프로그램의 스크린 샷을 가져옵니다

저는 Ubuntu Server 16.04.3을 사용하고 EGLFS QPA 백엔드와 함께 Qt 5.9.2를 사용하여 작성된 그래픽 응용 프로그램을 사용합니다. 첫 번째 가상 터미널 (문제가있는 경우)에서 시작한 다음 디스플레이를 풀 HD 그래픽 모드로 출력하도록 전환합니다.

는 I 샷으로 저장되고, 제 /dev/fb?에서 작동 된 가상의 단말기 (Ctrl + Alt + F1)의 내용 만 텍스트 모드 (예컨대 fb2png) 유틸리티를 사용하는 경우.

다른 프로세스의 컨텍스트에서 임의의 버퍼의 내용을 가져 오는 EGL API가 있습니다 (안전하지 않을 수 있음).하지만 GPU의 최종 출력에 액세스 할 수있는 메커니즘 (및 라이브러리)이 있습니까?

+0

응용 프로그램을 시작할 때 EGL 호출을 전달하고 'LD_PRELOAD'로로드하는 심 라이브러리를 만들 수 있습니다. – Velkan

+0

@Velkan 재미있는 아이디어, 감사합니다. 그래픽 응용 프로그램의 프로세스가 응답하지 않더라도 화면을 볼 필요가 있습니다. – Orient

답변

1
  1. 한 가지 방법은 glReadPixels()와 백 버퍼의 내용을 읽고, 귀하의 응용 프로그램 내에서 스크린 샷을 얻을 수있을 것이다. 또는 내부적으로 올바른 방법으로 glReadPixels()을 사용하는 QQuickWindow::grabWindow()을 사용하십시오. Qt 앱이 멈 추면 스크린 샷을 찍어야하기 때문에 이것은 별 도움이되지 않는 것 같습니다.

  2. 다른 방법은 DRM API를 사용하여 프레임 버퍼를 매핑 한 다음 memcpy 매핑 된 픽셀을 사용하는 것입니다. 이것은 Python을 사용하는 Chromium OS에서 구현되며 C로 쉽게 변환 될 수 있습니다 (https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/367611 참조). DRM API는 렌더링을 수행하는 Qt UI 프로세스 이외의 다른 프로세스에서도 사용할 수 있습니다.

관련 문제