任意软件投屏与操作 — 调研结论 v2

目标:在 Linux / Windows / macOS 三平台对任意桌面软件进行远程投屏与键鼠交互,含 iOS Simulator 操作场景
现有方案绑死 Chrome CDPPage.startScreencast + Input.dispatchMouseEvent),只能投射 Chromium 内部页面。 要扩展到「任意软件 + 三平台」,本质上要做的是 OS 级 KVM(Keyboard / Video / Mouse)。 但 iOS Simulator 测试是一个独立子问题——它有更精准的自动化路径(simctl + Appium/WDA),不应被强行塞进通用 KVM 方案。

结论:三条会话类型并行,而非线性过渡。 ① Web 页面 → 继续 CDP   ② iOS Simulator → simctl + WDA 专用链路   ③ 任意桌面 → VNC bridge → 可选升级 WebRTC Agent

方案 S · iOS Simulator 专用通道(最高优先级)

架构思路

最贴近原始需求 工程量:中低

用户的核心场景是「代码由 AI 写,用户在 Web 端点一点、测一测 iOS App」。 这不需要通用桌面 KVM——iOS Simulator 有专用的自动化接口,比像素级鼠标注入更精准、更可控。

三层架构

┌─────────────────────────────────────────────────────┐ │ Web 前端 (React) │ │ ┌──────────────┐ ┌─────────────────────────────┐ │ │ │ <video> / │ │ 点击/滑动/键盘 → WS/DataCh │ │ │ │ <img> 画面 │ │ 发送坐标+动作到后端 │ │ │ └──────┬───────┘ └──────────────┬──────────────┘ │ └─────────┼────────────────────────┼──────────────────┘ │ JPEG/WebRTC │ JSON events ┌─────────┴────────────────────────┴──────────────────┐ │ Go 后端 │ │ - 会话调度、鉴权、设备信息同步 │ │ - 坐标映射 (Web → Simulator 分辨率) │ │ - WebRTC signaling / WS frame relay │ └─────────┬────────────────────────┬──────────────────┘ │ │ ┌─────────┴────────────────────────┴──────────────────┐ │ macOS Agent │ │ ┌────────────┐ ┌──────────────┐ ┌────────────────┐ │ │ │ simctl │ │ Appium / │ │ ScreenCapture │ │ │ │ 生命周期 │ │ WDA 输入 │ │ Kit 窗口捕获 │ │ │ │ boot/ │ │ tap/swipe/ │ │ → H.264 编码 │ │ │ │ install/ │ │ type/press │ │ → WebRTC/WS │ │ │ │ launch │ │ │ │ │ │ │ └────────────┘ └──────────────┘ └────────────────┘ │ └─────────────────────────────────────────────────────┘

① 模拟器生命周期:xcrun simctl

# 列出设备
xcrun simctl list devices

# 启动模拟器
xcrun simctl boot <udid>

# 安装 & 运行 App
xcrun simctl install <udid> /path/to/MyApp.app
xcrun simctl launch <udid> com.example.MyApp

# 截图 & 录屏
xcrun simctl io <udid> screenshot out.png
xcrun simctl io <udid> recordVideo out.mp4

# 清理
xcrun simctl terminate <udid> com.example.MyApp
xcrun simctl erase <udid>

② 输入注入:Appium XCUITest / WebDriverAgent

Appium XCUITest Driver 基于 Apple 官方 XCTest 框架,通过 WebDriverAgent (WDA) 执行操作:

比 OS 级鼠标注入(CGEvent)更稳定——WDA 直接走 XCTest 框架,不受 TCC 权限限制。

③ 实时画面:渐进式升级

阶段方案延迟工程量
MVP 定频截图流:WDA screenshot / simctl io screenshot,压 JPEG 走现有 WS 200-500ms
体验升级 ScreenCaptureKit 捕获 Simulator.app 窗口 → H.264 → WebRTC <100ms
兜底 macOS 通用 KVM 控制整个桌面(方案 A/C) 取决于方案
限制条件
  • 只能在 macOS 上运行——iOS Simulator 依赖 Xcode/developer tools
  • 真机测试需要 Apple Developer 证书、设备信任、WDA 签名安装
  • 某些系统弹窗(权限请求等)需要 XCTest 特殊 API 处理
  • ScreenCaptureKit 需要 Screen Recording 权限(macOS 12.3+)

优势

  • 最贴近「AI 写代码、用户测试」的真实需求
  • WDA 比像素级鼠标注入更精准可控
  • 可获取 accessibility tree,为 AI 自动测试提供结构化信息
  • MVP 截图流可复用现有 WS 协议,前端改动极小
  • 不需要 Accessibility/辅助功能 TCC 权限

缺点

  • 仅限 macOS(iOS Simulator 的固有限制)
  • Appium/WDA 初始化有一定延迟(首次启动 ~10-30s)
  • 截图流 MVP 帧率有限,动画体验一般
  • 真机场景签名和信任链复杂

方案 A · VNC 桥(通用桌面 MVP)

架构思路

工程量:低

被控端跑平台原生 VNC server,Go 后端把 RFB 协议翻译成现有 WS 协议送给前端。定位:内部 demo/PoC,验证 Web UI 坐标映射、缩放、键鼠事件、会话生命周期等产品链路。

平台VNC server输入注入抓屏备注
Linux (X11) x11vnc(控制当前桌面) XTEST XGetImage / XShm TigerVNC 偏虚拟 session,控制物理桌面用 x11vnc
Linux (Wayland) gnome-remote-desktop / KDE RDP RemoteDesktop portal PipeWire ScreenCast portal wayvnc 仅限 wlroots compositor,不通用
Windows TightVNC / UltraVNC SendInput Mirror Driver / DXGI DD / WGC UAC/锁屏/管理员窗口受 UIPI 限制
macOS 系统自带「屏幕共享」 CGEvent CGDisplayStream 需 Screen Recording + Accessibility TCC 权限

优势

  • 复用现有 BrowserView.tsx 的 JPEG-MJPEG + 信用流 WS,前端几乎不改
  • 后端写 RFB → JPEG 帧转换器,Go 社区有现成 RFB 库
  • 部署门槛最低,三台机器装 VNC server 即可
  • 最适合快速验证产品链路(坐标映射、缩放、键鼠、录屏审计等)

缺点

  • RFB 转 JPEG 会丢掉增量编码优势(Tight/ZRLE/CopyRect),全帧传输带宽高
  • Wayland 不能用 x11vnc,需走 portal + gnome-remote-desktop,部署门槛陡增
  • 无音频、无硬件编码、画质上限低
  • 剪贴板、IME、组合键、多显示器、高 DPI、文件拖拽都需额外处理
  • 安全:X11 环境下 DISPLAY/Xauthority 即可全局控制,需注意隔离

方案 B · Guacamole 远程桌面网关(多协议生产级)

架构思路

工程量:中

Apache Guacamole 是协议转换网关,不是抓屏 agent。架构:浏览器 → Guacamole Web App (Java) → guacd (C) → 连接目标机上已有的 RDP/VNC/SSH server。

注意:noVNC 和 Guacamole 是两个独立方案,不应混为一谈:

路线适用场景融合成本
noVNC 直连 只需 VNC 协议,轻量嵌入 低(一个 JS 库 + WebSocket proxy)
Guacamole 全套 企业远程桌面网关、多协议、审计录制 高(Java Web App + guacd + 部署运维)

优势

  • 无自研抓屏代码,社区成熟
  • Guacamole 支持 RDP → Windows 体验最好(画质、剪贴板、音频)
  • 内置审计录制、认证扩展、堡垒机模型
  • noVNC 可轻量嵌入现有 React 前端

缺点

  • Guacamole 引入 Java + C 依赖,与纯 Go 二进制风格相悖
  • guacd 不是抓屏 agent——目标机仍需运行 RDP/VNC server
  • 不是低延迟视频流方案,Guacamole protocol 偏远程桌面绘制指令
  • Windows 走 RDP:需 Pro/Enterprise/Server 版本,Home 不支持作为 RDP host;且 RDP 会话可能与物理桌面隔离
  • 深度自定义 UI 与现有 React + AntD 融合成本不低

方案 C · 自研原生 Agent + WebRTC(长期可选能力)

架构思路

工程量:大

写轻量 Go / Rust agent,每平台用各自 OS API 抓屏/注入,编码后走 WebRTC 发到浏览器。建议先跑通单平台(macOS 或 Windows),再扩展。

平台抓屏输入注入硬件编码
Linux (X11) XShm / XGetImage XTest VAAPI
Linux (Wayland) xdg-desktop-portal ScreenCast + PipeWire xdg-desktop-portal RemoteDesktop + libei VAAPI
Windows DXGI Desktop Duplication / Windows Graphics Capture SendInput(受 UIPI 限制) MediaFoundation / NVENC / AMF / QuickSync
macOS ScreenCaptureKit(12.3+)/ CGDisplayStream(旧版兜底) CGEvent(需 Accessibility TCC) VideoToolbox
关键合规点(逃不掉)
  • macOS:Screen Recording TCC(抓屏)+ Accessibility TCC(输入注入)+ 可能的 Automation/Apple Events(控制其他 App)。权限按 bundle id 记录,CLI/未签名二进制体验差
  • Windows:UIPI/完整性级别限制——普通进程无法向管理员窗口、UAC secure desktop、锁屏/登录界面注入输入。uiAccess=true 需要签名 + 受信路径安装。DXGI 受 DRM/protected content 限制
  • Linux (Wayland):ScreenCast 和 RemoteDesktop 是两个独立 portal 接口,分别授权。实际可用性取决于 compositor 实现(GNOME/KDE/wlroots 差异大)。uinput 需设备权限且不等于"对当前桌面注入"
  • Linux (X11):权限模型宽松但安全性差——DISPLAY + Xauthority 即可全局控制,需做好网络隔离
WebRTC 工程复杂度(常被低估)
  • 信令协商、ICE/STUN/TURN、NAT 穿透
  • 弱网自适应、码率控制、关键帧请求
  • Pion 中转 vs WHIP ingest 是不同架构——WHIP 偏单向 ingest,不天然解决双向输入 DataChannel
  • "端到端 <100ms" 在局域网/硬编可达,跨公网/TURN/高分辨率多屏不保证
  • 鼠标坐标同步、权限断连重连、录制审计

优势

  • 画质与延迟上限最高,可做到产品级
  • 纯自研,可控可裁剪
  • 与项目 Go + React 技术栈一致
  • 支持音频(WebRTC 原生)

缺点

  • 三平台 OS API 全自研,工程量巨大
  • Wayland 输入/抓屏受 compositor 实现差异影响,碎片化严重
  • WebRTC + Pion 联调周期长、NAT/TURN 运维成本高
  • 权限/合规处理繁琐,各平台不同

方案 C 相关开源项目全景

核心问题:没有一个项目同时满足"三平台原生捕获 + WebRTC 推流到浏览器 + 浏览器端输入注入"。但各项目在不同维度上非常成熟,可以直接复用或作为技术参照。

Tier 1:WebRTC → 浏览器 + 输入注入(可直接使用)

neko

21k stars Apache-2.0
技术栈Go (后端, Pion WebRTC) + TypeScript/Vue.js (Web 客户端) + C (X11/XTEST via CGo)
平台Linux only(Docker 容器,amd64/arm64)
抓屏GStreamer ximagesrc 捕获 Docker 内 Xvfb 虚拟桌面——不是宿主机物理桌面
输入XTEST(XTestFakeKeyEvent/XTestFakeButtonEvent)+ 自研 xf86-input-neko 触屏驱动
编码VP8/VP9/H.264(x264)/AV1。硬编:NVENC、VAAPI(有专用 Docker 镜像)
Web 客户端完整 Vue.js SPA,全屏、剪贴板同步、多用户共享/锁定控制,可 iframe 嵌入
维护活跃,v3.1.0 (2026-04)

价值:最成熟的 WebRTC-to-Browser 方案。虽然捕获的是 Docker 虚拟桌面而非物理桌面,但如果目标是"在 Docker 里跑应用然后远程操作",可以直接用。Go + Pion 架构与本项目技术栈高度一致,Web 客户端代码可直接参考。

局限:不适合控制用户物理桌面或 macOS/Windows 应用。

selkies-gstreamer

1.8k stars MPL-2.0
技术栈Python (43%) + JavaScript/TypeScript (42%),GStreamer 核心
平台Linux only(Ubuntu/CentOS,Wayland WIP)
抓屏GStreamer ximagesrc (X11)。Wayland 支持正在集成(LinuxServer.io Smithay compositor)
输入pynput + Xlib (X11), xdotool, Wayland 下 wtype (合并中)
编码15 种编码器:NVENC/VAAPI/Vulkan Video (硬编) + x264/x265/VP8/VP9/SVT-AV1 (软编)。支持零拷贝 GPU 编码
Web 客户端gst-web——HTML5/JS,明确设计为可嵌入任何 Web 页面,类 noVNC 形态但走 WebRTC
维护活跃,Google 工程师 2019 年创建,用于学术/HPC 环境

价值架构最干净的 WebRTC 桌面投屏方案。Web 客户端可嵌入、编码器选择最丰富、MPL-2.0 许可友好。如果只做 Linux 桌面投屏,可以直接集成。

局限:Linux only,Python 技术栈与本项目不一致,社区较小。

CrossDesk

4.1k stars LGPL-3.0
技术栈C++ (98%)
平台Windows + Linux + macOS
协议MiniRTC——自研类 WebRTC 库,实现 RFC5245 NAT 穿透 + SRTP + H.264/AV1 + Opus
Web 客户端有,浏览器可直接操控远程桌面
维护活跃,v1.3.6 (2026-05),33 个 release

价值唯一跨三平台且有 Web 客户端的方案。轻量 RustDesk 替代品。

局限:非标准 WebRTC(MiniRTC),C++ 技术栈,社区相对小。

KasmVNC

5.1k stars · C++/C · Linux only。名字叫 VNC 但不走 RFB 协议,有 WebRTC UDP 模式。WASM + WebGL 渲染,比传统 VNC 帧率提升 150%+。

Mixed License · 驱动 Kasm Workspaces

Mira Screen Share

657 stars · Rust · Win + macOS。用 WGC (Win) / ScreenCaptureKit (macOS) 原生捕获,WebRTC P2P。60fps@4K,110ms 延迟

早期阶段 · 无 Linux

Tier 2:捕获/编码最强,但不走 WebRTC(需桥接)

Sunshine + moonlight-web-stream

38.6k stars GPL-3.0
技术栈C++ (74%),Vue.js 配置 UI
平台Windows + Linux + macOS + FreeBSD
抓屏Win: DXGI DD + WGC (beta)。Linux: KMS/NvFBC/wlr-screencopy/KWin/X11/XCB/PipeWire/XDG Portal。macOS: AVCaptureScreen
输入Win: SendInput + ViGEmBus (手柄)。Linux: uinput/XTest/inputtino。macOS: CGEventPost
编码H.264/HEVC/AV1 · NVENC/AMF/QSV/VAAPI/Vulkan Video/VideoToolbox 全覆盖,业界最完整
协议Moonlight 协议(RTSP + RTP/UDP + FEC),非 WebRTC
Web 客户端原生无。第三方 moonlight-web-stream (v2.10.0, 2026-05) 可桥接为 WebRTC → 浏览器
维护极活跃,日均提交

价值捕获 + 编码部分是开源界的标杆,三平台所有 GPU 厂商的硬编全覆盖。如果自研 Agent,应以 Sunshine 为技术参照。
最实用的组合方案:Sunshine 负责原生捕获和硬编 → moonlight-web-stream 桥接到 WebRTC → 浏览器显示和输入。代价是 GPL 许可 + 两个进程的集成复杂度。

RustDesk

117k stars AGPL-3.0
技术栈Rust (核心) + Flutter/Dart (UI) + WASM (Web)
平台Windows / Linux / macOS / Android(Host + Viewer)。iOS / Web(Viewer only)
抓屏Win: DXGI。Linux X11: XGetImage/SHM。Linux Wayland: PipeWire。macOS: ScreenCaptureKit/CGDisplayStream
编码VP8/VP9 (libvpx) + H.264/H.265 (hwcodec)。NVENC/QSV/AMF/VAAPI/VideoToolbox
协议自有协议(hbbs rendezvous + hbbr relay,UDP 打洞,Protobuf)。非 WebRTC
Web 客户端有但受限——仅 WebSocket(无 P2P),延迟高,剪贴板/音频/文件传输有限
维护极活跃,最大社区

价值:社区最大、平台最全的远程桌面。子 crate(scrap、hwcodec)可独立使用做抓屏/编码。

局限:AGPL 许可、Web 客户端体验差、不适合深度嵌入。

Tier 3:其他参考

Wolf

2k stars · C++ · MIT · Linux Docker。自研 headless Wayland compositor + Moonlight 协议。不捕获已有桌面,按需创建虚拟桌面。inputtino 库与 Sunshine 共享。

MIT · 多用户隔离游戏串流

Weylus

9.3k stars · Rust · AGPL · Win/Linux/macOS。WebSocket + MSE(非 WebRTC),用于平板当手绘板。Linux 触控笔/压感最好。主项目半维护,社区 fork (WeylusCommunityEdition) 更活跃。

AGPL · 半维护

Deskreen

21k stars · Electron · WebRTC。跨平台第二屏投屏。仅观看,无输入注入

View-only

scrcpy / minicap

Android 设备显示与控制。如扩展到 Android 测试,可结合 Appium UIAutomator2。

Apache 2.0 · Android only

许可证风险总结

商业参照(体验/权限/延迟指标):Parsec、AnyDesk、TeamViewer、Chrome Remote Desktop、Microsoft RDP

推荐路线:三条会话类型并行

不是 A → C 线性过渡,而是按会话类型独立演进

Phase 0 — 保持现状
Web 页面会话继续用 CDP / Playwright screencast。已经跑通,不动。

Phase 1 — iOS Simulator MVP(最高优先级)
simctl 管生命周期 + Appium/WDA 做输入 + 截图流复用现有 WS。
这最贴近「AI 写代码、用户测试」的核心需求,最快产生业务价值。
前端新增 SimulatorView.tsx,渲染截图 + 发送坐标事件。

Phase 2 — 通用桌面 PoC
VNC bridge 支持 X11 / macOS / Windows 基础桌面。明确不承诺 Wayland 完整体验
新增 DesktopView.tsx + Go RFB bridge。

Phase 3 — iOS Simulator 体验升级
ScreenCaptureKit 捕获 Simulator.app 窗口 → H.264 → WebRTC 视频。
输入仍走 WDA(比 CGEvent 稳定)。延迟从 200-500ms 降到 <100ms。

Phase 4 — 通用桌面 WebRTC 投屏(按需,三条路径选一)
路径 A(集成):Sunshine + moonlight-web-stream 桥接。捕获/编码能力最强,但 GPL 许可 + 双进程集成。
路径 B(嵌入):参考 neko(Go + Pion)架构自研轻量 agent,先跑通 macOS(ScreenCaptureKit + VideoToolbox + CGEvent),再扩展。
路径 C(Linux 快速):直接集成 selkies-gstreamer 的 gst-web 客户端,Linux 场景开箱即用。

Phase 5 — 企业网关(可选)
企业远程桌面/多协议网关需求强时,引入 Guacamole 作为独立 backend,不强行塞进自研 Agent 路线。

决策要点