在 Node.js 生态中做屏幕捕获开发时,你是否遇到过性能拉胯、跨平台兼容繁琐、底层 API 调用复杂的问题?传统 JS 实现的捕获库受限于单线程和运行时开销且无法直接从操作系统层的 GPU 拷贝,难以满足高帧率、低延迟的捕获需求;而原生 C/C++ 库又存在集成成本高、跨平台适配难度大的问题。
年前在琢磨远程桌面的时候,主包突发奇想,全程 Vibe Coding 并开源了一个屏幕捕获工具库 rs-capture 完美解决了这些痛点 —— 这是一款由 Rust 驱动的 Node.js 屏幕捕获库,通过 N-API 桥接原生系统 API,实现了跨平台、高性能、低开销的屏幕捕获能力,默认适配 macOS/Windows 原生捕获方案,同时提供灵活的配置和极简的集成方式,是 Node.js 端做屏幕监控、直播推流、远程桌面应用的理想选择。
一、rs-capture 核心优势
作为一款 Rust 原生开发的 Node.js 库,rs-capture 的核心优势体现在性能、兼容性、易用性三大维度,相比传统方案有质的提升:
- 🚀 极致性能:Rust 无 GC 特性 + N-API 桥接,底层无多余运行时开销,CPU/GPU 占用率远低于纯 JS 实现;
- 🖥️ 跨平台原生适配:macOS 默认使用苹果 ScreenCaptureKit(MacOS 12.3+),Windows 默认使用 DXGI(GDI 兜底),均为系统原生高性能捕获方案;
- 🏗️ 多架构支持:同时兼容 macOS/Windows 的 x64、arm64 架构,适配 Intel / 苹果芯片、Windows 端各类硬件;
- 🔧 高度可配置:支持自定义采样帧率(FPS)、手动选择捕获方案,兼顾性能和兼容性;
- 📦 原始分辨率输出:输出原始屏幕像素RGBA数据,不压缩,不缩放,开发者可以完全掌控后续的图像处理和压缩策略;
- 📸 双捕获模式:同时支持单帧截图和连续视频捕获,满足不同业务场景需求。
二、底层跨平台适配方案:原生 API 才是性能关键
针对 macOS 和 Windows 的系统特性,rs-capture 设计了 「默认原生后端 + 可选跨平台后端」 的双层适配方案,兼顾性能和兼容性。
2.1 macOS 平台:ScreenCaptureKit 为主,XCap 为辅
macOS 端默认使用苹果官方 ScreenCaptureKit(要求 macOS 12.3+),这是苹果为高性能屏幕捕获推出的原生框架,相比传统的 AVFoundation 有更低的延迟和更高的效率。
- 底层实现:基于 ScreenCaptureKit 的屏幕捕获会话,直接从系统图形服务获取帧数据,支持 GPU 级别的帧处理,避免 CPU 的冗余计算;
- 核心优势:低延迟(毫秒级)、高帧率、对苹果芯片(M 系列)做了深度优化,资源占用极低;
- 兜底方案:提供 XCap 跨平台后端作为可选,适配老旧 macOS 系统或有跨平台统一需求的场景。
2.2 Windows 平台:DXGI 为主,GDI 兜底
Windows 端采用 「DXGI 优先,GDI 兜底」 的自适应方案,完美解决了高性能和兼容性的平衡问题,这也是 rs-capture 相比同类库的一大亮点。
主后端方案:DXGI(DirectX Graphics Infrastructure)
DXGI 是微软推出的高性能图形捕获接口,基于 Desktop Duplication API 实现,是目前 Windows 端性能最优的屏幕捕获方案:
- 底层实现:直接与显卡驱动交互,访问显卡帧缓冲,仅捕获屏幕变化的脏矩形区域,而非全量帧数据,大幅降低系统开销;
- 核心优势:优先走 DXGI Desktop Duplication,绕过 GDI 的老旧路径,适合高帧率捕获;
兜底后端方案:GDI
针对 Win7 及以下老旧系统,或 DXGI 捕获失败的边缘场景,rs-capture 自动回退到GDI方案:
- 优势:兼容所有 Windows 版本,无系统版本限制,保证基础捕获能力;
- 不足:性能稍低,适合低帧率需求的兼容场景。
可选后端方案:XCap
与 macOS 一致,Windows 端也提供 XCap 跨平台后端,适合需要跨 macOS/Windows 统一捕获逻辑的业务场景。
2.3 跨平台统一设计:RGBA 原始帧 + 标准化 API
无论选择哪种底层后端,rs-capture 都会对帧数据做标准化处理,对外统一返回RGBA 格式的原始 Buffer 数据,并附带宽、高、行字节数(stride)等元信息,让上层业务无需关心底层实现差异,真正做到一次开发,跨平台运行。
三、快速上手
rs-capture 的 API 设计极其简洁,无需复杂的前置配置,安装后几行代码就能实现屏幕捕获,下面是完整的快速上手教程。
3.1 安装
支持 npm/pnpm 安装,无需手动编译 Rust 代码(已提供预编译的原生 Addon),开箱即用:
# npm 安装
npm install @vertfrag/rs-capture
# pnpm 安装(推荐)
pnpm add @vertfrag/rs-capture
3.2 完整基础示例
支持单帧截图和连续捕获两种核心能力:
import { ScreenCapture, CaptureBackend } from '@vertfrag/rs-capture'
// 处理捕获帧的回调函数
const onFrame = (frame) => {
// frame.rgba 是包含原始 RGBA 像素数据的 Buffer
console.log(`Frame received: ${frame.width}x${frame.height}, Stride: ${frame.stride}`)
console.log(`Data length: ${frame.rgba.length}`)
}
// 配置(可选)
const config = {
fps: 60, // 采样频率(默认:60),表示尽量每秒采样最多 60 次屏幕
// 在 macOS 上,你可以显式选择后端。
// macOS 上默认为 ScreenCaptureKit,其他平台默认为 XCap。
backend: CaptureBackend.ScreenCaptureKit,
}
try {
// 初始化捕获器
const capturer = new ScreenCapture(onFrame, config)
// 获取单个截图
console.log('Taking screenshot...')
const frame = await capturer.screenshot()
console.log(`Screenshot captured: ${frame.width}x${frame.height}`)
// 开始捕获
console.log('Starting capture...')
await capturer.start()
// 持续捕获 5 秒
setTimeout(() => {
capturer.stop()
console.log('Capture stopped')
}, 5000)
} catch (err) {
console.error('Error:', err)
}
3.3 关键注意事项
- macOS 权限:需要在系统设置中为运行程序开启「屏幕录制」权限,否则捕获会失败;
- Windows 系统版本:DXGI 后端要求 Win8+,Win7 及以下会自动回退到 GDI;
- 帧数据处理:
frame.rgba为原始 RGBA Buffer,可直接对接 ffmpeg、WebRTC 等工具做转码 / 推流; - ESM 兼容:库同时提供
index.js和index.mjs,完美支持 CommonJS/ESM 模块系统。
四、远程桌面
rs-capture的github仓库中的examples目录下,也利用该工具开发了一个简易的远程桌面demo示例程序(效果如上图gif所示)。
需要注意,实际运行时的效果可能会受网络和硬件设备条件影响有偏差。该demo仅作为远程桌面的基础原理实现,在实际成熟的远程桌面应用程序中还需要做多方面的优化,例如:
- 更优的图像压缩方案:提供多种软硬件编码
- 可靠且低延迟的网络传输:可靠 UDP 协议(如 KCP)
- 智能的服务质量控管:动态帧率(Adaptive FPS)、自适应码率(ABR)、流量控制
- 操作反馈响应:输入指令优化、光标处理优化
- 特定场景模式:提供“延迟优先”(牺牲画质换速度)与“画质优先”(牺牲速度换清晰度)的手动/自动切换开关,适配从办公到游戏的不同场景
这里也可以参考一款优秀的开源远程桌面:rustdesk
五、总结
rs-capture 是一款为 Node.js 量身打造的高性能屏幕捕获库,它借助了Node Addons对原生JS扩展的能力,利用 Rust + 原生系统 API 的组合,解决了纯 JS 库性能低、原生库集成难的痛点,同时通过标准化的 API 和跨平台适配,让开发者无需关心底层实现细节,只需专注于上层业务逻辑。
无论是快速实现一个简单的截图工具,还是开发高要求的直播推流、远程桌面监控系统,rs-capture 都能提供足够的性能和灵活性。目前项目处于活跃开发阶段,源码开源(MIT 协议),可自由使用和二次开发,欢迎大家去 GitHub 仓库 star、提 Issue、贡献代码!