我想打开网络摄像头并使用Xlib显示视频。 所以,我打开网络摄像头,获取图像,我做了类似的事情:
for(x = 0; x < webcamX; x++){
for(y = 0; y < webcamY; y++){
pixel = GetCameraPixel(x, y);
XDrawPoint(dpy, pixmap, pixel, x, y);
}
}
XCopyArea(dpy, pixmal, window, ....);
但是,调用XDrawPoint太慢了。 我也尝试过使用XImage,但这次XPutPixel和XPutImage都很慢(使用Pixmap比XImage更快)
我认为问题在于,执行XDrawPoint 640 * 480次会向X服务器发出大量请求。在进行XPutImage时,发送一个640 * 480的图像是相当的..不是吗?
所以,忘了网络摄像头,想象我想做一个游戏,一个动画,一个视频播放器,或者其他什么,只有XLib ..这可能吗?我确信逐像素绘制效率不高,所以我怎么能做得好呢? 我在互联网上找到的所有信息都是使用Pixmap或XImage,它比在窗口上绘图更好,但它并不适用。
例如,xscreensavers在全屏显示一个非常漂亮的动画(我认为他们只使用Xlib),他们如何能够平滑地制作动画?
感谢。
答案 0 :(得分:1)
嗯,我觉得这是我的错。 使用XImage是最好的方法,当像素一样逐像素地绘制时,它非常快速和平滑。 但是,我使用XYPixmap创建了XImage,它太慢了,我改为ZPixmap,一切都很完美!
因此,我用于网络摄像头的解决方案是:
image = XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)), DefaultDepth(dpy, DefaultScreen(dpy)), ZPixmap, 0, imagedata, webcamX, webcamY, 32, 0);
/* ....*/
for(x = 0; x < webcamX; x++){
for(y = 0; y < webcamY; y++){
pixel = GetCameraPixel(x, y);
XPutPixel(image, x, y, pixel);
}
}
XPutImage(dpy, window, gc, image, 0, 0, 0, 0, webcamX, webcamY);
我认为使用XYPixmap太慢了,因为X需要进行某种转换,因此这个过程非常慢