最近由于工作一直在研究抓屏,更确切的说是录制屏幕内容。现在总结一下抓屏的方法和技术。
抓屏的方法可以有如下几种:
1)GDI抓屏
2)DirectX抓屏
3)Windows Media Encoder抓屏
4)驱动级别抓屏
5)。。。
对于第一种抓屏方法,主要用设备环境(DC),通过获取当前桌面设备环境,然后通过BltBit和GetDIBits函数,将DDB(设备相关位图)转换为
DIB(设备无关位图),通过获取的屏幕象素数据。按照一定的帧率来组合成视频文件。
第二种方法是设置离屏表面,然后让主显示表面做翻转,就可以获取主屏幕的图像信息。
第三种以及后续的几种现在并没有做太多的实验去测试效果。
几种抓屏的优缺点:
GDI抓屏的速度还是比较快的,在I5+1G显卡+2G内存配置下,抓取一屏时间为3.5ms,但是这种方法存在一个严重的问题,就是当玩3d游戏的时候
会出现抓屏失败或者抓屏出现黑屏帧。会造成屏幕的闪烁。也就是对图像加速时,抓屏效果非常不理想。进行directshow(特别是在播放电影的时候)
根本抓不到电影播放的内容。
DirectX抓屏的速度不及GDI,GDI只需要将配置提升,抓屏效率明显提升,尤其是添加独立显卡的时候。但是DirectX的速度却没有因为添加硬件而
有太多的提升。
Windows Media Encoder抓屏的时候抓取游戏的时候也会出现一些问题。游戏不能全屏抓取。现在还在寻找其原因。
下一步策略:
当前需要一个高效的抓屏方法,1,2,3方法都在尝试,但是1,2不是很理想,需要对3进行验证,以及后续的4,或者5来提高效率,并且要求对游戏有很好的
兼容性。
考虑修改驱动进行直接的显卡获取数据的方法。
现在网上的资料主要是针对vnc的驱动级抓屏方法,好像效果比较好,但是并没有真正的测试过。至于Mirror Driver方法就需要以后的验证了。
各位楼主,不知道那位在抓屏上有更好的方法,可否提出来大家一起共同学习一下。谢谢。。。