中文 | English
macOS 原生 RDP 服务端,可使用另一台 Mac 上的 Windows App 连接当前桌面。本仓库关注客户端兼容性、编码性能与稳定性。
最新发行版:v0.1.0,首个公开源码版本。完整变更见 CHANGELOG,各版本的功能、修复与使用说明见 Releases。
发行版提供源码 ZIP / tar.gz。下方说明对应持续开发的 main;固定标签 v0.1.0 保留发行时的 macOS 14+ 要求和配置行为。项目处于 0.x 开发阶段,共享当前登录桌面,不创建独立的 macOS 登录会话。
版本采用 vMAJOR.MINOR.PATCH 标签:补丁版本用于兼容性修复,次版本用于新功能;0.x 阶段的兼容性变化会在发行说明中注明。main 持续开发,需要固定版本时使用对应标签。
本项目基于 x6nux/macrdp 进行后续开发,初始代码取自上游提交 6be70bb。屏幕采集、RDP 服务、编码和管理界面的原始实现来自该项目,感谢原作者及贡献者。
保留上游 GPLv3 许可证,详见 LICENSE。仓库中的两份 IronRDP 修改版保留各自的 MIT / Apache-2.0 许可证;这些文件并未重新授权为本项目许可证。
本仓库增加或修复:
- Windows App 新版本 GFX 能力协商:跳过未知能力版本,确认双方支持的版本,避免连接后完全黑屏。
- 依据实际编码器选择采集格式,修复硬件初始化失败后回退软件却继续采集 NV12 的问题。
- 软件编码的带补齐尺寸色彩转换加速、复用图像缓冲区;修复 AVC444 行距与双码流关键帧请求。
- 硬件编码身份校验和编码失败后的关键帧恢复。
- 凭据诊断输出脱敏及 TLS-only 空密码认证修复。
- macOS 13 或更高版本,已安装 Xcode Command Line Tools。
- 当前稳定版 Rust;前端开发另需 Node.js 20+。
- 运行桌面服务需要“屏幕录制”和“辅助功能”权限。
git clone https://github.com/likehbbfoe/MacRDP.git
cd MacRDP
cargo build --locked --release -p macrdp-server
cp config.example.toml config.toml编辑 config.toml,替换用户名及密码占位内容,然后启动:
./target/release/macrdp-server --config config.toml查看服务端版本:
./target/release/macrdp-server --version构建 Tauri 管理界面:
cd macrdp-ui
npm ci
npm run tauri -- build --bundles app在 Windows App 中添加电脑,地址填写服务端的局域网 IP 和端口,例如 <Mac-IP>:13389。使用配置中的 RDP 凭据,不是 macOS 登录密码。
port = 13389
username = "rdp-user"
password = "CHANGE_ME"
resolution = "1920x1080"
frame_rate = 30
encoder = "hardware"
chroma_mode = "avc420"
quality = "balanced"
bitrate_mbps = 20| 选项 | 行为 |
|---|---|
hardware |
请求 VideoToolbox 硬件 H.264;无法初始化时服务端回退 OpenH264 并使用 BGRA 采集 |
software |
OpenH264 CPU 编码,色彩转换使用可用的 Accelerate/vImage 路径 |
auto |
优先使用可用的 VideoToolbox 硬件编码,初始化失败后回退 OpenH264 |
avc420 |
单码流,建议优先使用 |
avc444 |
主/副双码流,需兼容的客户端,通常消耗更多编码资源和带宽 |
硬件编码使用系统媒体编码资源,不等同于通用 GPU 计算。帧率设置是目标值,实际性能取决于分辨率和工作负载。示例配置提供更多选项。
| 环境 | 主线处理方式 |
|---|---|
| macOS 13 Ventura | 构建目标最低版本;使用 ScreenCaptureKit,修改采集帧率需重启服务 |
| macOS 14 及更新版本 | 使用同一份主线代码,可用的系统能力按运行环境启用 |
| Apple Silicon | 尝试 VideoToolbox 低延迟硬件 H.264,优先使用 NV12 直接采集路径 |
| Intel Mac | 按 VideoToolbox 实际返回的硬件能力选择编码模式,不依赖芯片型号名单 |
| 不具备所需硬件编码能力或资源不足 | 自动回退 OpenH264 软件编码;也可主动选择 software |
| Windows App / Microsoft Remote Desktop | 按 RDP 能力协商选择 AVC444、AVC420 或传统图像传输,不依赖客户端版本号字符串 |
| 不支持 GFX / AVC 的客户端 | 回退传统位图传输,可用的压缩方式由 RDP 协商决定;仍要求客户端支持 Fast-Path 输出和 32 位色深 |
| macOS 12 及更早版本 | 当前原生采集依赖要求 macOS 13,尚不属于本构建的运行范围 |
服务端 macOS 和客户端 macOS 是两个独立要求:客户端应用能否安装,由 Microsoft 对该版本的要求决定。项目共享当前桌面,不能补充客户端应用自身缺失的系统支持。
硬件编码采用能力探测:低延迟模式不可用时尝试普通硬件会话,随后才回退软件。AVC444 还需客户端支持与足够的双会话编码资源。Apple 的 HEVC、AV1 或 ProRes 硬件能力不会自动转换为本服务的 RDP 输出格式;当前服务输出 H.264/AVC 或传统位图,解码由客户端完成。
| 配置 | 可选值与含义 |
|---|---|
encoder |
auto(默认)、hardware、software;旧别名 vt / videotoolbox / gpu 和 openh264 / oh264 / cpu 继续可用 |
chroma_mode |
avc420(默认,兼容性优先)或 avc444(文字色彩细节优先,需要客户端支持) |
quality |
low_latency、balanced、high_quality;影响自动码率目标 |
frame_rate |
1–120;旧机器或低带宽可从 15 / 30 开始 |
bitrate_mbps |
1–1000,单位 Mbps;省略时自动计算,数值不是性能保证 |
resolution |
auto、明确尺寸(如 1920x1080);兼容旧的整数缩放值 1–4 |
width / height |
旧式尺寸配置,应同时为 0 或同时指定;优先使用 resolution 设置最终采集尺寸 |
show_cursor |
是否在采集画面中包含光标 |
尺寸每边最大 8192 像素,总像素不超过 7680×4320。服务在启动前拒绝未知编码选项、无效帧率和超范围尺寸,避免配置拼写错误被静默忽略。
推荐配置:
- 日常局域网:
encoder = "auto"、chroma_mode = "avc420"、30 fps、1920×1080。 - 偏重文字色彩:使用
avc444,客户端不支持时按协商结果降级。 - 旧机器或硬件资源紧张:
encoder = "software"、avc420、15–30 fps,降低分辨率与码率。
更改采集或编码选项后,重新启动服务并重新连接客户端,使相关配置一起生效。兼容改进优先进入同一主线;只有无法共享实现的系统差异才考虑独立维护的正式版本。
不同客户端及编码模式的兼容性仍有差异。
4K 动态 AVC444 仍可能出现 VideoToolbox 原生丢帧,暂不保证稳定的 4K/30fps。帧率和码率配置是目标值,硬件资源、画面变化和网络会影响实际表现。
目前仍需完善鼠标点击坐标与拖动、多显示器坐标、动态分辨率及长时间连接稳定性。CLI 与管理界面存在不同的显示处理路径。硬件资源不可用时性能会受到软件回退影响。
crates/macrdp-server:CLI 服务端。crates/macrdp-core、macrdp-ui:核心服务与 Tauri 管理界面。crates/macrdp-capture、macrdp-input:采集与输入。crates/macrdp-encode:VideoToolbox、OpenH264 与色彩转换。crates/ironrdp-server-gfx、ironrdp-acceptor-patched:修改后的协议依赖。
通过 Issues 报告问题或提出功能建议,请注明 MacRDP 版本、macOS 版本、客户端版本及相关编码配置。请勿公开密码、证书私钥或其他个人信息。代码改进可提交至 main 的 Pull Request。
- x6nux/macrdp:本项目直接基于的原始代码仓库。
- IronRDP:Rust RDP 协议实现。
- FreeRDP:协议与 AVC444 实现参考。
- OpenH264:软件 H.264 编解码。
- RustDesk:上游采集和输入架构的参考项目。