所有文章

iMirror:一个开源的 macOS 菜单栏 AirPlay 投屏接收器

王子豪 ·

iMirror 应用图标

iMirror 是一个 macOS 菜单栏小工具:打开后,iPhone、iPad 或另一台 Mac 可以在“控制中心 → 屏幕镜像”里直接选中这台 Mac,把画面投过来。源码按 GPLv3 公开在 github.com/erniu96/iMirror,Releases 里有可直接安装的 dmg,最新版本是 1.2.1(2026-10-06)。

解决什么问题

macOS 12 起系统自带“隔空播放接收器”,但画面是全屏铺开的,不方便缩在屏幕一角边看边干活。开源的 UxPlay 很好用,但主要面向 Linux 命令行,在 Mac 上要自己装 GStreamer 等依赖。

我想要的是:

适合:做 iOS 开发和测试的人、需要在会议或直播里展示手机屏幕的人、家里想把孩子 iPad 画面放到大屏 Mac 上看的人。

功能

怎么实现的

整体分两半:协议层沿用开源项目,Mac 端的应用、解码、显示和音频是我们写的。

SwiftUI 菜单栏与设置
   └ AppModel(用例编排)
       ├ AirPlayReceiverService ─ ObjC++ Bridge ─ AirPlay/RAOP 协议层(C,开源派生)
       ├ VideoSessionRouter ─ 每个会话:VideoPipeline ─ VideoToolbox ─ Metal 窗口
       └ AudioPlaybackEngine ─ 每个会话:解码器 ─ AVAudioPlayerNode(统一混音)

协议层(不是我们写的):AirPlay/ 目录约 3.6 万行 C 代码,来自 UxPlay / RPiPlay 一系的 AirPlay/RAOP 接收实现,包括 RTSP/HTTP 握手、配对、FairPlay(PlayFair)、镜像流解密和 NTP 时钟。里面还带着 libplist、llhttp、csrp、tiny-AES-c、axTLS AES 等组件,各自许可证和版权声明原样保留在 ThirdParty/。我们对这一层只做了减法和少量适配:删掉没用到的 Curve25519/Ed25519、PlayFair 发送端、树莓派调试转储,以及把密钥写进日志和文件的调试代码,每个改过的文件头部都写了“iMirror modifications”。下面“我们写的部分”里的随机配对码和 AWDL 直连,虽然代码在这个目录里,但不是上游的。因为协议层是 GPLv3 派生代码,iMirror 整体也按 GPLv3 发布。

我们写的部分(约 3500 行 Swift / ObjC++,另有测试、构建与发布脚本):

实际效果

安装

  1. 从 Releases 下载 iMirror-1.2.1-macOS-universal.dmg(Apple Silicon / Intel 通用,需要 macOS 14+),把图标拖进“应用程序”。

    dmg 安装窗口的背景图,写着“把 iMirror 拖到应用程序文件夹”和被拦截时的处理办法

    上图是 dmg 窗口里实际使用的背景图(仓库 Resources/DMG/),不是运行截图。

  2. 发布版只做了 ad-hoc 签名,没有经过 Apple 公证,第一次打开会被拦截:macOS 15 及以上到“系统设置 → 隐私与安全性”底部点“仍要打开”;macOS 14 右键 → 打开;或者在终端运行 xattr -dr com.apple.quarantine /Applications/iMirror.app。

  3. 首次启动允许“本地网络”权限。在 iPhone 控制中心点“屏幕镜像”,选带标记的 iMirror-XXXX,输入 Mac 上显示的四位验证码。

也可以从源码安装:装好 Xcode Command Line Tools 后运行 bash install.sh。

已知限制

欢迎试用、提 Issue 或贡献翻译:github.com/erniu96/iMirror。