windows 您所在的位置:网站首页 window的截屏 windows

windows

#windows| 来源: 网络整理| 查看: 265

Windows抓屏技术 前3项是主要在使用monitor capture 技术方案。是obs 的实现

文章目录 1. BitBlt (DC)1.1 调用过程1.2 优缺点 2.DXGI2.1 调用流程2.2 性能对比2.3 优缺点 3. WGC(Windows Graphics Capture)4. Mirror driver(win8 之前适用)5、GDI hook( 适用较少)6. Windows Media API(依赖SDK 不常用)优缺点: 7. PrintWindow8. DWM/Dxgi hook9. GetWindowDC

1. BitBlt (DC)

目前windows 上最通用的技术方案

1.1 调用过程 GetDC(GetDesktokWindow() )获取桌面的DC然后使用CreateDIBSection创建一个设备无关位图以及内存DC使用BitBlt把桌面DC的复制到内存DC,这样通过内存DC就能直接获取到原始RGB数据。 1.2 优缺点

优点:GDI函数实现的通用做法,能在所有windows平台实现

缺点:通用归通用,截取的效率则是有点低,尤其是要达到每秒20帧以上的截取,占用CPU有点高,GDI不能获取鼠标,需要在截取的图像中把鼠标画上去。

2.DXGI

Windows8以后微软引入了一套新的接口,叫“Desktop Duplication API”,而由于Desktop Duplication API是通过Microsoft DirectX Graphics Infrastructure (DXGI)来提供桌面图像的,速度非常快。由于是通过GPU,所以cpu占用率很低,性能很高。

2.1 调用流程 创建D3DDevice通过一系列接口获取路径,获取到IDXGIOutputDuplication接口调用AcquireNextFrame,获取当前桌面数据,保存在IDXGIResource中把数据从GPU映射到内存中拷贝需要的数据到自己的buffer里

这套接口是集成在DirextX之中的,所以更大部分DirectX接口的使用方式基本一致,也就是通过D3D,各种QueryInterface,各种Enum,核心方法,是AcquireNextFrame

获取到IDXGIOutputDuplication接口,是通过如下路径: IDXGIDevice --> IDXGIAdapter --> IDXGIOutput --> IDXGIOutput1 --> IDXGIOutputDuplication

2.2 性能对比

引用 DXGI快速截屏录屏技术 在这里插入图片描述

2.3 优缺点

优点:性能非常好 缺点:只能是windows 8 以上平台

Desktop Duplication 这是微软Win8 上宣布放弃Mirror driver之后推荐采用的抓屏技术, 全部基于D3D/DXGI技术, 效率非常高, 并且包含变化区域和屏幕鼠标光标。它的缺点是没法抓取某个窗口的内容 。 3. WGC(Windows Graphics Capture)

是WinRT 提供的接口,obs 中提供了c++ 调用的实现(libwinrt),大家可以自行查看。

从 Windows 10 版本 1803 开始,Windows.Graphics.Capture命名空间提供 API 以从显示或应用程序窗口获取帧,以创建视频流或快照以构建协作和交互体验。

WGC 介绍官网msdn 屏幕截图

4. Mirror driver(win8 之前适用)

从 Windows 8开始,镜像驱动程序将不会安装在系统上

先了解2个基本概念

XPDM模型:windows2000以上的系统, 属于XPDM模型的显示驱动,这是个很老的驱动模型,只支持到WinXP系统WDDM模型:Windows Vista (WDDM v1.0) 中引入的图形显示驱动程序体系结构。 从 Windows 8 (wddm v1.0) 开始需要 wddm。

MirrorDriver 这是个驱动截取方法,MirrorDriver就是显示镜像驱动,这个来源于 随着计算机图形技术的发展尤其是3D技术的发展,老的XPDM模型已经不再适应最新3D技术。

该方法也有一些缺点: a. 涉及到驱动安装, 技术难度大, 系统权限要求也高 b. Win8 上该方案已经失效, 但是还是有方法的, 参见 Remote Display Drivers

5、GDI hook( 适用较少)

这种方法应该说是XP时代比较流行的抓屏方法, 因为所有的绘制都是通过GDI32.dll中的绘图函数来实现的, 所以我们只要拦截了这些函数, 系统的所有绘制就都让我们控制了。这种方法应该来说也是一种挺高效的抓屏方法,屏幕的变化也都能让我们拦截到, 同时因为好多绘图函数是以矢量方式实现的,所有抓到的数据包非常小, 即使在低带宽下也效果挺好。 下面是该方法的一些缺点: a. Hook技术本身就有其复杂性和不稳定性, 尤其是Hook所有进程 b. Vista越来越多程序采用D2D/D3D绘制, GDI Hook对这些绘制无能为力。 c. Vista之后UAC打开的情况下, 如果我们的程序权限不够高, Hook不到更高权限的程序。

6. Windows Media API(依赖SDK 不常用)

Windows Media 9.0 支持用Windows Media Encoder 9 API来抓屏。它有一个编码器叫Windows Media Video 9 Screen codec,特别为抓屏优化过。Windows Media Encoder API提供了一个IWMEncoder2接口可以用来高效地捕捉屏幕图像。而且版本都是比较老。

优缺点:

优点:如果屏幕录制,可以支持一整套的接口 缺点:是用户机器需要安装Windows Media Encoder 9。

7. PrintWindow

该方法本身不能直接做为一种抓屏方法, 但是有时候我们要获取某个窗口的内容, 即使他被其他窗口覆盖着, 这时候这个函数就很有用。该方该调用法的原理是通过给目标窗口发送WM_PRINT或是WM_PRINTCLIENT消息, 所以如果目标窗口没有响应, 该调用可能会阻塞抓屏线程, 这种情况下抓屏前最好先用SendMessageTimeout检测目标窗口是否有响应。另外该方法也抓不到D3D窗口的内容。

8. DWM/Dxgi hook

Vista之后微软放弃了XP时代的XPDM, 采用了全新的WDDM视屏驱动模型, 现在Win8.1上已经是WDDM1.3. Vista之后底层所有的渲染都是基于D3D技术, 另外我们也知道系统在DWM.exe里进行窗口边框的绘画和合成, 所以理论上我们可以通过HOOK DWM/D3D/DXGI,拦截到整个系统的屏幕内容。当然作为一种Hook技术, 它也有上面GDI Hook类似的问题。

9. GetWindowDC

该方法和PrintWindow类似,但是它没有PrintWindow的权限问题, 也没有超时问题。 这种抓屏方法在Win7/Win8 DWM打开的情况下抓屏,结果会颠覆我们XP时代的知识, 因为即使窗口被覆盖, 它也可以正确抓取到被覆盖窗口下的内容, WebRTC正是用这种方式来Share Application的。 它的主要问题是有些窗口抓到的内容不包含非客户区,有些窗口比如任务栏的Thumbnail窗口会抓不到内容。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有