📌 项目地址:peetzweg/opendisplay | ⭐ 3,471 颗星 | 🔧 Swift | 📜 未标注
仓库:peetzweg/opendisplay · Swift · 3,471 stars
先说结论
iPhone、iPad、旧 Mac,都能变成你 Mac 的第二块屏幕。免费,开源,不用订阅,不用买硬件,数据不出局域网。这是 3,471 星的 OpenDisplay。
市场上已有的方案各有一个硬伤:
- Sidecar:免费,但要求两台设备登录同一 Apple ID,iPhone 完全不支持,硬件组合也受限。
- Duet Display:改成订阅制了。
- Luna Display:必须花大价钱买个 dongle 插在 Mac 上。
OpenDisplay 补的就是这个空缺。项目作者在 README 里说得直白:如果你正打算自己写一个,别写了,虚拟显示器创建、低延迟 H.264 管线、USB 传输、输入注入这些难点已经跑通,来贡献代码。
真扩展,不是投屏
很多“副屏”方案本质是屏幕镜像。OpenDisplay 不一样:macOS 把设备识别为一块真实的第二显示器,窗口可以拖过去,位置可以在系统设置里排列。镜像模式也有,但那是可选项。
虚拟显示器的分辨率和设备面板逐像素对应(@2x),所以 Retina 屏上的文字是锐利的,不是糊一层缩放。旋转设备,虚拟显示器会以原生分辨率重建为竖屏。
传输层:USB 走 usbmuxd,WiFi 走 Bonjour
这是我觉得工程上最干净的部分。
USB 模式直接用 macOS 内置的 usbmuxd,通过 Lightning/USB-C 线传输。插上就用,不依赖网络,没有 WiFi 抖动,也不用装任何 helper 工具。
WiFi 模式零配置:iPhone 通过 Bonjour 自我广播,Mac 端下拉菜单里选一下就连上了。
视频管线是按延迟优化的
看技术选型就知道作者是认真调过的:
- VideoToolbox 硬件 H.264 编码,实时模式,不用 B 帧
- TCP_NODELAY 关掉 Nagle 算法
- 丢帧时做背压,配合关键帧恢复,避免画面糊掉卡死
- 解码渲染用
AVSampleBufferDisplayLayer
每一项都在砍延迟,而不是为了兼容性做妥协。
触摸输入
iPhone 直接变成 macOS 的触摸屏:点一下是点击,拖动就是拖动,双指滚动,手感接近触控板。Apple Pencil 支持在路线图上,还没做。
别忽略旧 Mac 这个用法
项目还提供一个 OpenDisplay Receiver 应用(macOS 12+),装在闲置旧 Mac 上,另一台 Mac 就能通过 WiFi 或 Thunderbolt/以太网线把屏幕扩展过去,同样是原生 Retina 分辨率。家里那台退役 MacBook 可以直接挂起来当副屏用。
隐私与结构
整个方案就两个小应用、一条 TCP 连接,你的屏幕数据不经过任何第三方服务器。自己编译自己跑。
使用前要知道的
- 追求最低延迟就插线,WiFi 的表现取决于网络环境。
- Apple Pencil 还不支持。
- 具体安装和构建步骤,README 的 Quick start 部分没有给出命令行指令,去项目官网(peetzweg.github.io/opendisplay)和仓库看。
- 想做定制的开发者可以省大事了——四个核心难点都已经在仓库里跑通,站在它上面改比重造轮子划算。