我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

屏幕截图与画面录制方案比较

来源:网络 更新时间:2024-08-10 09:31:05

窗口/屏幕截图适用于截图、批注等工具场景,时时获取窗口/屏幕图像数据流。下面将介绍视频会议共享桌面、远程桌面等场景如何实现画面录制。

常见的屏幕画面时时采集方案,主要有GDI、WGC、DXGI。

GDI

GDI(Graphics Device Interface)是使用user32下WindowsAPI来实现,是 Windows 操作系统中最早、最基础的图形设备接口,满足所有windows平台。屏幕/窗口截图可以详见: .NET 窗口/屏幕截图 - 唐宋元明清2188 - 博客园

录制屏幕,可以基于GDI截图方案,使用定时器捕获屏幕数据。

GDI性能不太好,尤其是针对高帧率及高分辨率需求,达到每秒20帧以上的截取,占用CPU就有点高了。另外GDI不能获取鼠标,需要在截取的图像中把鼠标画上去。

所以GDI使用很方便、不依赖GPU,对性能要求不高的截图场景建议直接使用这个方案。

WGC

Windows Graphics Capture ,是Win10引入的一种新截取屏幕以及截取窗口内容的机制。WinRT提供接口访问,Csproj属性中添加: true

截图代码实现示例:

  1. 创建捕捉项:使用 CreateCaptureItemForMonitor 或 CreateCaptureItemForWindow 来创建捕捉项。
  2. 创建D3D11设备和上下文:调用 D3D11CreateDevice 创建 Direct3D 11 设备和设备上下文。这里虽然没有使用DXGI截图,但引用了DXGI的设备类型
  3. 转换为 Direct3D 设备:将 D3D11 设备转换为SharpDX Direct3D 设备对象。
  4. 创建帧池和会话:使用 Direct3D11CaptureFramePool 和 GraphicsCaptureSession。
  5. 开始捕捉:调用 StartCapture 开始会话,并注册帧到达事件。
  6. 处理帧:在帧到达事件中处理捕获的帧

我们这里是使用比较成熟的SharpDX来处理Direct3D,引用如下Nuget版本:


获取到截取的D3D对象帧,帧画面转数据流:

将Surface对象转换为获取 SharpDX的Texture2D,映射到CPU以内存拷贝方式输出图像字节数据。

上面默认是输出三通道8位的Bgr24,如果是四通道Bgra32可以按如下从内存拷贝:

拿到字节数据,就可以保存本地或者界面展示了。

屏幕截图Demo显示:

WGC利用了现代图形硬件和操作系统特性、能够提供高性能和低延迟的屏幕捕抓,适用于实时性比较高的场景如屏幕录制、视讯会议等应用。

更多的,可以参考官网
屏幕捕获到视频 - UWP applications | Microsoft Learn
也可以浏览、运行我的Demo: kybs00/CaptureImageDemo (github.com)

DXGI

全名DirectX Graphics Infrastructure。从Win8开始,微软引入了一套新的接口Desktop Duplication API,而由于Desktop Duplication API是通过DXGI来提供桌面图像的,速度非常快。

DXGI使用GPU,所以cpu占用率很低,性能很高。DXGI官网文档: DXGI - Win32 apps | Microsoft Learn

因为DXGI也是使用DirectX,所以很多接口与WGC差不多。也就是通过D3D,各种QueryInterface,各种Enum,核心方法是AcquireNextFrame

它有个缺点,没办法捕获窗口内容。所以视讯会议共享窗口,是无法通过DXGI实现

我们看看Demo调用代码,

捕获画面帧数据:

也是使用硬件加速将2D纹理资源拷贝,然后通过内存拷贝输出为字节数据。

1080P的本地录屏、显示,CPU、GPU使用情况如下:

1080P和WGC方案没有明显差别,延时也接近。但4K、8K分辨率下,DXGI方案更优,能够直接管理图形硬件和提供高性能渲染。它是与内核模式驱动程序和系统硬件进行通信的,借用下官网的架构图:

所以在需要极低延迟和高帧率的4K场景中,DXGI能提供必要的性能优化。

上面3个方案Demo示例,详细代码都在github仓库: kybs00/CaptureImageDemo (github.com)

总结下这三个方案

GDI:适用于所有 Windows 版本,但性能较低。

WGC:Win10 1803版本以上,高性能和低延迟,屏幕及窗口均支持。

DXGI:Win8版本以上,适用于高分辨率高帧率等高性能的需求,并且只支持屏幕录制、不支持窗口。

录制主要是录屏、直播、远程桌面、视讯会议、传屏等场景。录制屏幕/窗口建议优先使用WGC,然后用DXGI兼容win8;如果仅录制屏幕且高分辨率、高帧率场景,建议优先DXGI

关键字:录屏、录制窗口、高性能屏幕捕获