• 抓屏方法以及技术实现


    最近由于工作一直在研究抓屏,更确切的说是录制屏幕内容。现在总结一下抓屏的方法和技术。

    抓屏的方法可以有如下几种:

    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方法就需要以后的验证了。

    各位楼主,不知道那位在抓屏上有更好的方法,可否提出来大家一起共同学习一下。谢谢。。。 

    Insert mode
  • 相关阅读:
    Eureka 系列(04)客户端源码分析
    Eureka 系列(03)Spring Cloud 自动装配原理
    Eureka 系列(02)Eureka 一致性协议
    Eureka 系列(01)最简使用姿态
    Feign 系列(05)Spring Cloud OpenFeign 源码解析
    python 线程,进程与协程
    Python IO多路复用
    python 作用域
    python 网络编程:socket(二)
    python 网络编程:socket
  • 原文地址:https://www.cnblogs.com/xingyayang/p/2085684.html
Copyright © 2020-2023  润新知