我一直在尝试找到一种直接从 X 窗口抓取视频的方法,并被指向 Xlib 和合成扩展。
到目前为止,我已经能够使用以下代码监听更改事件并获取像素图:
#include <X11/Intrinsic.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xdamage.h>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char ** argv) {
int br, base;
Window win = 0x3400003;
Display *dsp = XOpenDisplay(0);
XCompositeQueryExtension(dsp, &base, &br);
XDamageQueryExtension(dsp,&base, &br);
cout << base << endl;
Damage damage = XDamageCreate(dsp, win, XDamageReportRawRectangles);
XCompositeRedirectWindow(dsp, win, CompositeRedirectAutomatic);
XEvent ev;
while(true) {
XNextEvent(dsp, &ev);
if(ev.type == base + XDamageNotify) {
Pixmap pm = XCompositeNameWindowPixmap(dsp, win);
XWindowAttributes attr;
XGetWindowAttributes(dsp, win, &attr);
XWriteBitmapFile(dsp, "test.bmp", pm, attr.width, attr.height, -1, -1);
return 0;
}
}
XCompositeUnredirectWindow(dsp, win, CompositeRedirectAutomatic);
XDamageDestroy(dsp, damage);
return 0;
}
这里的问题是生成的 bmp(由 XWriteBitmapFile 创建)是黑白的可怕。不管我不想将数据写入文件这一事实,我显然在阅读它时做错了什么。我很想将 Pixmap 转换为 opengl 中的帧缓冲区或 ram 中的二进制 blob。
在此先感谢您提供的任何帮助。
最好的祝福。