Highlight
macOS Ventura 和 iOS 16 引入了 Continuity Camera,Mac 可以直接使用 iPhone 的摄像头作为外接摄像头。这项功能不仅提供高质量的视频输入,还支持 iPhone 独有的 Center Stage(人物居中)、Studio Light(工作室光效)和 Desk View(桌面俯瞰)等特效。
核心内容
Mac 上的摄像头体验,过去常常停在两个选择:内置摄像头,或者用户手动接上的外置摄像头。设备断开、合上 MacBook 盖子、出现更合适的摄像头时,App 往往要让用户自己重新选择。
Continuity Camera 把 iPhone 暴露成 Mac 上的外接摄像头和麦克风。用户只要满足 macOS 13、iOS 16、同一 Apple ID、两步验证,以及 USB 或近距离无线连接等条件,iPhone 就会出现在 Mac 的摄像头列表里(00:40)。
对现有 App 来说,最直接的变化是:如果已经使用 AVFoundation 的标准捕获链路,很多体验会自动获得 iPhone 的视频质量、Center Stage、Portrait、Studio Light 和 Desk View(07:58)。
这场 session 的重点,是让 App 在多摄像头环境里更像系统应用:能自动跟随系统推荐的摄像头,也能记住用户手动选择;能从 iPhone 视频流捕获最高 1200 万像素照片;还能把 Desk View 当成一个独立的 AVCaptureDevice 接入自己的采集流程。
详细内容
自动选择摄像头
(08:43)macOS 13 在 AVCaptureDevice 上增加了两个类属性:userPreferredCamera 和 systemPreferredCamera。
userPreferredCamera 可读写。用户在 App 里手动选择摄像头时,App 应该把这个设备写进去。AVFoundation 会为每个 App 记住用户偏好,并在设备连接、断开、重启后继续给出可用建议。
systemPreferredCamera 只读。它会结合用户偏好、设备状态和 Continuity Camera 的自动选择信号,给出系统认为当前最合适的摄像头。例如 iPhone 放在静止支架上、横向摆放、屏幕关闭,并且通过 USB 或近距离无线连接到 Mac 时,Continuity Camera 会发出应该被自动选择的信号(10:44)。
概念示例:
// Pseudocode based on the session transcript.
if automaticCameraSelectionEnabled {
observe(AVCaptureDevice.systemPreferredCamera) { camera in
replaceVideoInput(with: camera)
}
}
func userDidPickCamera(_ camera: AVCaptureDevice) {
AVCaptureDevice.userPreferredCamera = camera
if !automaticCameraSelectionEnabled {
replaceVideoInput(with: camera)
}
}
关键点:
automaticCameraSelectionEnabled代表 App 自己的自动模式开关;session 建议同时提供手动和自动模式(11:56)。- 自动模式下观察
systemPreferredCamera,属性变化时更新AVCaptureSession的视频输入。 - 用户手动选择摄像头时,总是写入
userPreferredCamera,这样系统能保留该 App 的偏好历史。 - 手动模式下停止跟随
systemPreferredCamera,直接使用用户选择的设备。
用 iPhone 视频流捕获高分辨率照片
(14:33)Continuity Camera 把 iPhone 的照片质量带到 macOS。macOS 13 之前,macOS 的照片捕获只支持视频分辨率;使用 Continuity Camera 后,可以捕获最高 1200 万像素照片。
session 给出的启用流程分两层:先在 AVCapturePhotoOutput 上打开高分辨率捕获,再在每次拍摄的 AVCapturePhotoSettings 上启用高分辨率照片。
概念示例:
// Pseudocode based on the session transcript.
let photoOutput = AVCapturePhotoOutput()
photoOutput.isHighResolutionCaptureEnabled = true
photoOutput.maxPhotoQualityPrioritization = .quality
let settings = AVCapturePhotoSettings()
settings.isHighResolutionPhotoEnabled = true
settings.photoQualityPrioritization = .quality
settings.flashMode = .auto
photoOutput.capturePhoto(with: settings, delegate: photoDelegate)
关键点:
isHighResolutionCaptureEnabled对应 transcript 中的highResolutionCaptureEnabled,需要在开始采集前配置到AVCapturePhotoOutput。isHighResolutionPhotoEnabled对应 transcript 中每次 capture 的highResolutionPhotoEnabled,决定本次拍摄是否输出高分辨率照片。maxPhotoQualityPrioritization限制输出对象允许的最高质量优先级。photoQualityPrioritization为单次拍摄选择速度和质量之间的取舍。flashMode可以选择开、关,或让系统按场景和光线自动决定(15:58)。
接收人脸和人体元数据
(16:14)AVCaptureMetadataOutput 在 macOS 上可用后,App 可以从 iPhone 的 Continuity Camera 视频流里接收 timed metadata。session 明确提到两类对象:face metadata objects 和 human body metadata objects。
接收人脸元数据的流程很直接:给 session 增加 AVCaptureMetadataOutput,检查支持的 metadata 类型,把对象类型数组设为 face,最后设置 delegate 接收实时回调。
概念示例:
// Pseudocode based on the session transcript.
let metadataOutput = AVCaptureMetadataOutput()
session.addOutput(metadataOutput)
if metadataOutput.availableMetadataObjectTypes.contains(.face) {
metadataOutput.metadataObjectTypes = [.face]
metadataOutput.setMetadataObjectsDelegate(delegate, queue: metadataQueue)
}
关键点:
AVCaptureMetadataOutput()创建一个专门接收元数据的输出。session.addOutput(metadataOutput)把它接入已经配置好视频输入和输出的 capture session。availableMetadataObjectTypes用来确认当前设备支持哪些元数据类型。.face对应 session 中的人脸 metadata object type。- delegate 会在 session 开始运行后收到实时的人脸元数据回调。
把 Desk View 当作独立摄像头
(18:01)Desk View 不只是在 Control Center 里启动的系统 App。macOS 13 还把 Desk View 暴露成单独的 AVCaptureDevice。
找到 Desk View 设备有两种方式:在 device discovery session 里查找 Desk View camera 设备类型;或者从主摄像头的 companionDeskViewCamera 属性取得配套的 Desk View 设备。第二种方式适合周围有多个 Continuity Camera 设备时,把主摄像头和桌面俯拍画面配对。
概念示例:
// Pseudocode based on the session transcript.
let deskViewCamera = mainCamera.companionDeskViewCamera
if let deskViewCamera {
useWithVideoDataOutput(deskViewCamera)
useWithMovieFileOutput(deskViewCamera)
useWithPreviewLayer(deskViewCamera)
}
关键点:
mainCamera是已经选中的 Continuity Camera 主视频设备。companionDeskViewCamera用来取得与主摄像头配对的 Desk View 设备。- Desk View 设备可以用于 video data output、movie file output 或
AVCaptureVideoPreviewLayer。 - session 给出的 Desk View 当前格式是 420v pixel format,分辨率 1920 × 1440,最高 30 fps(19:00)。
核心启发
1. 视频会议 App 的自动摄像头模式
- 做什么:给摄像头选择菜单增加“自动选择”开关。
- 为什么值得做:
systemPreferredCamera会在 Continuity Camera 准备好时变化,能减少用户进会后手动切换摄像头的步骤。 - 怎么开始:在自动模式下观察
AVCaptureDevice.systemPreferredCamera,变化时替换AVCaptureSession的视频输入;用户手动选择时写入AVCaptureDevice.userPreferredCamera。
2. Mac 文档采集工具的高质量拍照
- 做什么:在 Mac App 里用 iPhone 作为摄像头拍摄纸质收据、白板或手写草稿。
- 为什么值得做:Continuity Camera 在 macOS 13 上支持最高 1200 万像素照片捕获,比只拿视频帧更适合保存和识别。
- 怎么开始:使用
AVCapturePhotoOutput,先启用高分辨率捕获,再为每次AVCapturePhotoSettings启用高分辨率照片和质量优先级。
3. 教学 App 的桌面俯拍视图
- 做什么:在主讲人画面旁边显示 Desk View,用来演示手写、模型、乐器或手工操作。
- 为什么值得做:Desk View 可以与主摄像头同时使用,session 建议主摄像头开启 Center Stage,让脸和身体构图更稳定(06:52)。
- 怎么开始:从主 Continuity Camera 设备读取
companionDeskViewCamera,把该设备接入 preview layer 或 video data output。
4. 互动创作工具的人脸元数据输入
- 做什么:在 Mac 创作 App 里根据人脸位置驱动画面布局、贴纸或录制辅助线。
- 为什么值得做:macOS 上的
AVCaptureMetadataOutput可以从 iPhone 视频流接收人脸和人体元数据。 - 怎么开始:给 capture session 添加
AVCaptureMetadataOutput,检查availableMetadataObjectTypes后订阅 face metadata object,并在 delegate 中处理实时回调。
关联 Session
- Create camera extensions with Core Media IO — 讲 macOS 摄像头系统扩展,适合继续理解虚拟摄像头、硬件摄像头和系统摄像头输入如何暴露给 App。
- Capture machine-readable codes and text with VisionKit — 讲 VisionKit Data Scanner,适合把摄像头输入继续用于文本和条码识别。
- Discover advancements in iOS camera capture: Depth, focus, and multitasking — 讲 iOS 摄像头采集的新能力,适合补充理解深度、对焦、多任务和多视频输出。
评论
GitHub Issues · utterances