Media & Web 进阶 20m
将连续互通相机引入你的 macOS App
Bring Continuity Camera to your macOS app
2022年6月6日
一句话判断
Continuity Camera 让 iPhone 无缝变身 Mac 的高质量摄像头和文档扫描仪,你的 App 几乎不需要额外代码就能接入这套体验。
这场 Session 讲了什么
macOS Ventura 和 iOS 16 引入了 Continuity Camera,Mac 可以直接使用 iPhone 的摄像头作为外接摄像头。这项功能不仅提供高质量的视频输入,还支持 iPhone 独有的 Center Stage(人物居中)、Studio Light(工作室光效)和 Desk View(桌面俯瞰)等特效。
对于开发者来说,好消息是大部分场景不需要写新代码。如果你的 App 已经使用了 AVFoundation 的标准捕获 API 或者 NSTextView 的附件功能,Continuity Camera 会自动生效。Session 详细介绍了系统如何通过虚拟摄像头设备(Virtual Camera Device)暴露 iPhone 摄像头,以及在什么情况下需要额外适配。
Session 还涵盖了文档扫描场景:用户可以直接从 Mac 上触发 iPhone 扫描文档,结果自动传回 Mac。这通过现有的 NSSharingServicePicker 和文档扫描 API 实现。
值得深挖的点
- 零代码集成:使用 AVCaptureSession 的 App 无需任何修改。系统在 AVCaptureDevice 列表中自动暴露 iPhone 摄像头,表现为一个虚拟设备。用户在系统设置中选择后,App 就能使用。
- Desk View 的技术原理:利用超广角摄像头同时拍摄桌面和人物,通过裁剪和变形生成两个独立的视频流。你的 App 可以同时接收两个 AVCaptureInput。
- Reactions 特效:视频通话中的手势触发特效(烟花、爱心等)是通过 AVCaptureSession 的 metadata output 实现的,你的 App 可以选择是否展示这些特效。
- 系统级 UI 集成:当 iPhone 在 Mac 附近且可用时,系统的相机指示灯会亮起,菜单栏会显示相机选择器。你的 App 不需要自己实现设备发现逻辑。
代码片段
// 使用 Continuity Camera 不需要特殊代码
// 标准的 AVCaptureSession 设置即可自动发现 iPhone 摄像头
let session = AVCaptureSession()
let discovery = AVCaptureDevice.DiscoverySession(
deviceTypes: [.builtInWideAngleCamera],
mediaType: .video,
position: .unspecified
)
// discovery.devices 中会包含 iPhone 的虚拟摄像头设备
// 用户也可以通过系统级相机选择器切换
// 文档扫描:使用现有的 NSSharingServicePicker
// 无需额外代码,系统自动提供"从 iPhone 扫描"选项
最佳实践
- 不要假设摄像头设备列表是固定的,Continuity Camera 可能随时连接或断开
- 处理 AVCaptureDevice 的
wasConnected/wasDisconnected通知,给用户合理的 UI 反馈 - 如果你的 App 有自定义的相机选择 UI,确保包含系统虚拟摄像头设备
- Desk View 的宽高比和普通摄像头不同,UI 布局需要适配
- 测试时注意 iPhone 长时间作为摄像头使用的发热和耗电情况
还有什么值得关注
- “What’s new in AVFoundation” 涵盖了 Continuity Camera 底层的 AVFoundation 变更
- “Get more out of your video calls with Continuity Camera” 从用户角度介绍了功能
- 如果你开发视频会议 App,Center Stage 和 Studio Light 是差异化功能点
- 配合 Stage Manager 使用时,注意多窗口场景下的摄像头设备管理
WWDC 2022