VisioForge

C# 与 .NET 跨平台屏幕录制

用一套 API 在 Windows、macOS、Linux、Android 和 iOS 上构建 C# 屏幕录制程序:全屏、单个窗口或一个区域,带声音、光标和点击高亮,输出为 MP4 或直播流。Video Capture SDK .NET 和 Media Blocks SDK .NET 使用各平台的原生采集 API。

每年 €250 起 · Lifetime 许可证 €750 起

截图循环不是屏幕录制程序

Graphics.CopyFromScreen 在 Windows 上只能给你一张位图。录制程序还需要稳定的帧率、光标、声音、编码器,以及音频与视频保持同步的文件;而在其他每个操作系统上,采集 API 又各不相同:macOS 上是 AVFoundation 或 ScreenCaptureKit,Linux 上是 X11,Android 上是 MediaProjection,iOS 上是 ReplayKit。在 VisioForge SDK 中,屏幕就像网络摄像头一样是一个视频源。ScreenSourceBlock 使用其运行平台的原生 API,编码器、文件和流在所有平台上都是同一套代码。

自行构建跨平台屏幕录制程序与使用 SDK 的对比

典型的自研方案VisioForge Video Capture SDK .NET 与 Media Blocks SDK .NET
采集屏幕每个操作系统使用不同的原生 API,各自需要自己编写互操作代码:Windows 上是 Desktop Duplication 或 Windows Graphics Capture,macOS 上是 ScreenCaptureKit 或 AVFoundation,Linux 上是 X11 或 PipeWire,Android 上是 MediaProjection,iOS 上是 ReplayKitScreenSourceBlock,每个平台一个设置类;不带参数的 ScreenSourceBlock() 使用平台默认源
单个窗口或区域窗口标识和裁剪代码因操作系统而异:Windows 上是 HWND,Linux 上是 X11 窗口 ID窗口用 WindowHandle(Windows)或 XID(Linux),区域用 Rectangle,显示器用 MonitorIndex(Windows)或 Monitor(macOS)
光标与点击自己把光标和点击标记合成到每一帧上Windows、macOS 和 Linux 上的 CaptureCursor;MouseHighlight 在每次点击处绘制一个扩散的圆圈,点击在 Windows 上来自全局鼠标钩子,在其他平台上由你的代码传入
声音每个操作系统用单独的音频 API 采集麦克风,Windows 上再用 WASAPI 环回采集系统声音,并由你的代码与视频同步所有平台的麦克风用 SystemAudioSourceBlock,Windows 系统声音用 LoopbackAudioCaptureDeviceSourceSettings,与视频处于同一时间线
编码与文件逐个封装 Media Foundation、VideoToolbox 和 MediaCodec,或者随每个应用分发一份 FFmpeg 构建H264EncoderBlock 选择 MediaCodec、VideoToolbox,或 NVENC、AMF 和 Quick Sync,以 OpenH264 作为后备;输出 MP4、WebM、MKV、MOV、AVI 或 MPEG-TS
需要维护的代码五套平台实现,需要编写、测试并保持一致一条 C# 管道;只有源的设置因平台而异

各平台的屏幕采集

不带参数的 ScreenSourceBlock() 会选择平台的默认源。传入设置对象即可选择 API、窗口或区域。

平台采集 API设置类声音说明
WindowsWindows Graphics Capture、DXGI Desktop Duplication、DirectX 9、GDIScreenCaptureD3D11SourceSettings、ScreenCaptureDX9SourceSettings、ScreenCaptureGDISourceSettings系统声音(WASAPI 环回)或麦克风显示器、区域或单个窗口;点击高亮
macOSAVFoundationScreenCaptureMacOSSourceSettings麦克风需要屏幕录制权限:ScreenSourceBlock.AskPermissions()
Mac Catalyst (.NET MAUI)ScreenCaptureKitScreenCaptureMacOSSourceSettings麦克风与 macOS 相同的设置类
LinuxX11ScreenCaptureXDisplaySourceSettings麦克风需要 X11 会话;XID 或 XName 用于选择窗口
AndroidMediaProjectionAndroidScreenCaptureSourceSettings麦克风用户接受系统提示;录制在前台服务中运行
iOSReplayKitIOSScreenSourceSettings、IOSBroadcastSourceSettings麦克风录制你自己的应用,或通过 Broadcast Upload Extension 录制整台设备

SDK 为屏幕录制程序提供什么

屏幕和桌面录制在 VideoCaptureCoreX(Video Capture SDK .NET)中是一个视频源,在 Media Blocks SDK .NET 中是一个 ScreenSourceBlock。源之后的一切都与摄像头相同:预览、录制、推流和视频特效。

  • 三种采集模式:任意显示器的全屏、按句柄指定的单个应用窗口,或桌面上的一个矩形区域
  • 在 Windows 10 1803 及更高版本上默认选择 Windows Graphics Capture;也可使用 DXGI Desktop Duplication、DirectX 9 和 GDI 源
  • 通过 WASAPI 环回采集电脑声音,或采集麦克风;在 Media Blocks SDK .NET 中,AudioMixerBlock 可将两者混合为一条音轨
  • 光标采集和点击高亮,颜色、半径和持续时间可配置,适用于教程和演示。在 Windows 上点击来自全局鼠标钩子:设置 MouseHighlight 后,VideoCaptureCoreX 会在启动时安装钩子;在 Media Blocks 中需调用 MouseHighlightSubscribe()。在其他平台上,由你的代码将每次点击传给 MouseHighlightAddClickEvent(VideoCaptureCoreX 中为 MouseHighlight_AddClickEvent)
  • 硬件 H.264:Android 上是 MediaCodec,Apple 平台上是 VideoToolbox;在 Windows 上 SDK 依次尝试 NVENC、AMF 和 Quick Sync,并回退到 OpenH264
  • 同时多路输出:在通过 RTMP、SRT 或 NDI 将同一屏幕推流到 YouTube 的同时录制 MP4;无需停止预览即可暂停和恢复录制或开始新文件
  • 在 Windows、macOS、Linux、Android 和 iOS 上使用同一套 API,支持 WinForms、WPF、.NET MAUI 以及原生 macOS、Android 和 iOS 应用;每种都有示例

应用场景

教程与在线学习录制

录制一个窗口或整个屏幕,带旁白和点击高亮,并将课程保存为 MP4。

技术支持与会话录制

录下用户在问题出现之前的操作,并将视频附加到支持工单中。

QA 与测试自动化

录制每次自动化 UI 测试的运行过程,并保留失败测试的视频作为证据。

演示与直播

将屏幕推流到 YouTube 或 NDI 接收端,同时从同一采集中保存一份本地 MP4。

代码示例

精简自 Video Capture SDK .NET 和 Media Blocks SDK .NET 的 Screen Capture 演示。前两个运行在 WinForms 窗体中,第三个运行在 .NET MAUI 页面中;每个都有一个名为 videoView1 或 videoView 的 VisioForge VideoView。

将屏幕和系统声音录制为 MP4

C#

录制单个窗口并高亮点击

C#

适用于 Windows、macOS、Android 和 iOS 的同一个录制程序(.NET MAUI)

C#

管道

窗口示例和 .NET MAUI 示例使用相同的四个模块。ScreenSourceBlock 使用平台 API 采集屏幕,TeeBlock 将帧分配给预览和编码器,MP4SinkBlock 写入文件。不同平台之间只有源的设置会变化。

ScreenSourceBlock
TeeBlock
H264EncoderBlock
MP4SinkBlock

常见问题

如何录制电脑正在播放的声音?▼
使用 LoopbackAudioCaptureDeviceSourceSettings,并传入通过 DeviceEnumerator.Shared.AudioOutputsAsync(AudioOutputDeviceAPI.WASAPI2) 获得的输出设备,然后像第一个示例那样将 Audio_Record 设为 true。如需旁白,请改用 AudioSourcesAsync 中的麦克风。要同时录制两者,请在 Media Blocks SDK .NET 中用 AudioMixerBlock 混音。
能录制被其他窗口遮挡的窗口吗?▼
可以,使用 Windows Graphics Capture:将 API 设为 D3D11ScreenCaptureAPI.WGC,将 WindowHandle 设为该窗口的句柄。WGC 采集的是窗口自身的内容,因此重叠的窗口不会出现在录制中。最小化的窗口不会绘制任何内容,因此无法采集。
能在 macOS 和 Linux 上运行吗?▼
可以。在 macOS 上,屏幕源使用 AVFoundation,需要屏幕录制权限:ScreenSourceBlock.AskPermissions() 会显示系统提示,新权限在应用重启后由 macOS 生效。在 Linux 上,ScreenCaptureXDisplaySourceSettings 采集 X11 显示,因此应用需要 X11 会话。编码器、文件和流与 Windows 上相同;系统声音环回仅限 Windows,所以在这些平台上请录制麦克风。
能在 Android 和 iOS 上录制屏幕吗?▼
可以,使用 Media Blocks SDK .NET。在 Android 上,AndroidScreenCaptureSourceSettings 接收用户接受系统提示后应用获得的 MediaProjection。在 iOS 上,IOSScreenSourceSettings 通过 ReplayKit 录制你自己的应用,IOSBroadcastSourceSettings 通过 Broadcast Upload Extension 录制整台设备。
为什么录制画面是黑的?▼
受保护的内容(如 DRM 视频)会被操作系统禁止采集。对于其他黑帧,请尝试另一种采集 API(WGC 或 DXGI Desktop Duplication)或 DirectX 9 源。在双 GPU 笔记本电脑上,Desktop Duplication 必须运行在驱动显示器的那块显卡上;用 DXGIAdapter 选择它。
我需要哪个 SDK?▼
如果需要现成的采集引擎,选 Video Capture SDK .NET:设置 Video_Source、Audio_Source 和一个输出,然后调用 StartAsync。如果要用模块搭建管道,例如在屏幕和编码器之间加入自己的处理,选 Media Blocks SDK .NET。两者使用相同的屏幕源。