WWDC Quick Look 💓 By SwiftGGTeam
Bring Continuity Camera to your macOS app

Bring Continuity Camera to your macOS app

观看原视频

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 上增加了两个类属性:userPreferredCamerasystemPreferredCamera

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:14AVCaptureMetadataOutput 在 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

评论

GitHub Issues · utterances