Windows屏幕捕获技术分析

Windows屏幕捕获技术分析

背景

要想提高录制的帧率,有两个关键因素:编码速度 和屏幕获取速度。本文主要记录Windows图形显示的基本概念,了解这些概念后,对于提速就有了明确的方向。

图形显示基本概念

Windows GDI

Windows GDI(Graphics Device Interface ,图形设备接口)是Windows操作系统最早期提供的一套用于绘图的API,允许程序在屏幕、打印机等输出设备上绘制文字、图像、线条等图形内容。可以通过其中的BitBlt函数拷贝屏幕内容,实现截图功能。

特点:

  • 支持窗口录制
  • 兼容性最好,适用于所有Windows版本

DirectX

GDI是早期的Windows图形接口,主要由CPU驱动,适用于简单图形绘制;DirectX是现代图形和多媒体API集合,核心由GPU驱动,适合游戏和高性能图形处理。这两种接口都可以使用,但DirectX更现代化、效率更高。

DirectX功能模块:

DXGI

DXGI(DirectX Graphics Infrastructure) 是Microsoft提供的一套接口:

  • 是DirectX的一个子系统(基础设施层)
  • 管理显卡适配器(GPU) 、输出设备(显示器) 、显示模式 、交换链(SwapChain)
  • 提供底层功能,供Direct3D 10/11/12使用
  • 和捕获屏幕本身没有直接关系,但提供了实现入口

Desktop Duplication API

Desktop Duplication API 是从Windows 8开始 引入的一组专门用于高效捕获桌面画面的接口。

核心函数:

cpp 复制代码
IDXGIOutput1::DuplicateOutput

它实际上就是DXGI中的一部分功能,是通过DXGI提供的接口来实现桌面捕捉的。换句话说:Desktop Duplication API是DXGI提供的桌面捕获功能接口,是DXGI功能集的一部分。

特点:

  • 多屏支持
  • 不支持窗口录制。若窗口被遮挡或最小化,该区域会显示为被遮挡/黑屏/透明

常见屏幕捕获方法对比

方法/特性 BitBlt(GDI) Desktop Duplication API DirectX(D3D) Mirror Driver
平均耗时(1080p) 20~50ms 2~8ms 5~15ms 1~5ms
CPU占用 高 低 中 极低
GPU占用 低 中 中 高
适用系统 全Windows Win8+ 全Windows 需安装驱动
单个窗口录制 ✅支持 ❌不直接支持,只能裁剪 ✅支持 ✅支持
遮挡窗口内容 仍可能录制(驱动支持) ❌遮挡区域为遮挡内容 部分支持 ✅完整支持
最小化窗口 有时能录,有时黑屏 ❌黑屏 部分支持 ✅完整支持
鼠标指针 手动叠加 ✅可选自动附带 手动叠加 手动叠加
多显示器 部分支持 ✅完整支持 ✅支持 ✅支持
游戏画面录制 ❌撕裂严重 ✅合适,OBS使用 ✅合适 ✅合适

补充:Windows Graphics Capture (WGC)

Windows 10 1903+ 引入了新的捕获API,支持窗口级捕获、最小化窗口录制,是未来推荐的方向。参考:Windows.Graphics.Capture介绍


DirectX与Desktop Duplication API的差异

判断一个程序使用DirectX还是Desktop Duplication API进行屏幕捕获,只要看到DuplicateOutput被调用,就基本可以确定使用的是Desktop Duplication API。即便后续用了CopyResource、Map、Unmap,也是正常的数据访问流程。


实战选型建议

各方案适用场景分析

场景 推荐方案 理由
办公软件/桌面录制 Desktop Duplication API 低CPU占用,帧率高
单窗口录制(需后台运行) WGC或Mirror Driver 支持最小化/遮挡录制
游戏录制/直播 Desktop Duplication API 无撕裂,OBS已验证
兼容老旧系统(Win7) BitBlt 全平台兼容
企业级远程桌面 Mirror Driver 极低延迟,但需驱动签名

性能优化建议

  1. 避免每帧重新创建资源:DXGI Surface和Texture应复用,减少GPU内存分配开销
  2. 使用GPU映射而非CPU拷贝:Map/Unmap比CopyResource更快
  3. 脏区域检测 :Desktop Duplication API提供GetFrameDirtyRects,只更新变化区域
  4. 鼠标指针分离绘制:利用API提供的鼠标信息,避免每帧合成

实际项目选型经验

  • OBS Studio:使用Desktop Duplication API,性能最优
  • Teams/Zoom屏幕共享:WGC方案,支持窗口级捕获
  • 企业远程控制软件:Mirror Driver或自研内核驱动

坑点提醒:

  • Desktop Duplication不支持单个窗口,需自行裁剪
  • WGC在某些虚拟机上不可用(需要WDDM 2.x驱动)
  • BitBlt在高DPI屏幕上需设置DPI感知,否则截图模糊

参考


相关推荐
TK泰妞30 分钟前
爆款视频怎么改成TikTok带货内容?
人工智能·prompt·音视频
吴声子夜歌35 分钟前
HTML——富媒体资源元素(音视频)
html·音视频·媒体
百事牛科技9 小时前
WinRAR注释功能:给压缩包留个便签
windows·winrar
音视频牛哥10 小时前
四足机器人如何做好智慧电力巡检?从低延迟图传到可信巡检数据闭环
音视频·四足机器人·智慧电力巡检·whip whep·机器人巡检·工业音视频巡检·智能电力巡检技术方案
sukalot10 小时前
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(一)
windows·驱动开发
加载力科技11 小时前
硬盘咔咔响是坏盘信号!赶在数据丢失前克隆换盘:不重装系统、不丢文件
windows·嵌入式硬件·系统安全·策略模式·命令模式·硬盘
美狐美颜sdk11 小时前
直播APP接入美颜SDK后出现卡顿怎么办?从性能瓶颈寻找解决方案
android·人工智能·音视频·美颜sdk·直播美颜sdk
美狐美颜SDK开放平台11 小时前
直播APP开发实战:从摄像头调用到视频美颜sdk集成
android·人工智能·计算机视觉·音视频·直播美颜sdk
2601_9623649713 小时前
电脑人脸解锁的安全基石,聊聊 Windows Hello 硬件规范
windows·安全·电脑
2601_9623811313 小时前
历史视频朝代更替动效怎么做?把 AE 关键帧换成 AI 分镜动画的实战拆解
人工智能·nginx·音视频