一. 前言
众所周知,屏幕共享是实时音视频互动中十分重要的一项功能,能够帮助参会者访问另一台计算机或桌面的内容,从而实现文档、图片、多媒体等的实时共享。而在实现屏幕共享的过程中,我们就不得不来聊一聊抓屏技术。Windows系统上有很多抓屏技术,不同的抓屏技术又局限于Windows系统版本,没有一种通用的抓屏技术可以高效的抓取屏幕图像,其中主要的原因是操作系统的显示驱动模型在从XDDM向WDDDM转变,应用层的API也在从GDI向D3D转变。比较主流的屏幕采集方式有GDI、Mirror driver、DXGI、Magnification、WGC,本文针对这几种方式进行简要介绍。
二. 显示器驱动模式
Windows 显示驱动程序模型要求图形硬件供应商提供配对的用户模式显示驱动程序和内核模式显示驱动程序。
Windows 2000 显示驱动程序模型 (XDDM) 是用于 Windows 2000 到 Windows Vista 和 Windows 7 的旧显示/图形驱动程序体系结构。Windows 显示驱动程序模型 (WDDM) 是 Windows Vista (WDDM 1.0) 中引入的图形显示驱动程序体系结构。 从Windows 8 (WDDM 1.2) 开始,需要 WDDM。
(一)XDDM模型
下图显示了在 Windows 2000 及更高版本上显示所需的组件。
上图中的阴影元素表示随 Windows 2000 及更高版本一起提供的服务。 无阴影元素指示需要第三方显示驱动程序和视频微型端口驱动程序,以便图形适配器在 Windows 2000 及更高版本中显示。
对于可与基于 NT 的操作系统一起使用的每种类型的图形卡,必须同时具有显示驱动程序和相应的视频微型端口驱动程序。 微型端口驱动程序专为一个图形适配器 (或适配器系列) 编写。 可以为共享公共绘图接口的任意数量的适配器编写显示驱动程序;例如,VGA 显示驱动程序可与 VGA 或 ET4000 微型端口驱动程序一起使用。 这是因为显示驱动程序会绘制,而微型端口驱动程序执行模式设置等操作,并将有关硬件的信息提供给驱动程序。 也可以让多个显示驱动程序与特定的微型端口驱动程序一起使用;例如,16 色和 256 色 SVGA 显示驱动程序可以使用同一微型端口驱动程序。
(二)XDDM模型
WDDM 显示驱动程序模型体系结构由用户模式和内核模式部分组成。 下图显示了支持 WDDM 所需的体系结构。
图形硬件供应商必须提供用户模式显示驱动程序和显示微型端口驱动程序 (也称为内核模式显示驱动程序或 KMD) 。
-
用户模式显示驱动程序是 Direct3D 运行时加载 (DLL) 的动态链接库。
-
显示微型端口驱动程序与 DirectX 图形内核子系统通信。
-
核心模块是D3D,同时还兼容了GDI。
三. 桌面采集技术简介
(一) GDI:第一代桌面采集
Windows 图形设备接口(GDI)是为与设备无关的图形设计的。基于 Windows 的应用程序不能直接访问图形硬件,应用程序通过 GDI 来与设备驱动程序进行交互。GDI 截图就是通过屏幕的DC获取到当前屏幕的位图数据。
-
特点:不受windows版本限制,基本兼容各版本的系统。
-
缺点:使用CPU,消耗大量cpu运算时间,性能低,帧率低。
代码实现主流程:
// 获取桌面设备上下文
HDC hdcScreen = GetDC(nullptr);
// 获取桌面宽度和高度
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSys