WWDC Quick Look 💓 By SwiftGGTeam
Discover Continuity Camera for tvOS

Discover Continuity Camera for tvOS

观看原视频

Highlight

tvOS 17 引入 Continuity Camera 和 Mic,iPhone/iPad 可以作为 Apple TV 的摄像头和麦克风输入源。现有 iOS 相机 App 只需添加 Device Discovery 即可适配 tvOS,配合 AVAudioEngine 的语音处理 API 可实现视频会议、直播等全新场景。

核心内容

tvOS 上的 App 以前只有两类:内容播放(流媒体)和游戏。现在有了摄像头和麦克风,内容创作、视频会议、直播等全新场景成为可能。

00:25)tvOS 17 的 Continuity Camera 与 macOS Ventura 上的实现类似:把 iPhone 或 iPad 靠近 Apple TV,摄像头和麦克风就成为系统的输入设备。

已有 iOS 代码基本可用

02:15)tvOS 现在支持 iOS 上的全套 AVFoundation 捕获 API:

  • AVCaptureDevice / AVCaptureDeviceInput:摄像头和麦克风
  • AVCaptureSession:捕获会话主控
  • AVCaptureOutput:输出(照片、视频、元数据)
  • AVCaptureVideoPreviewLayer:实时预览

如果你已有 iOS 相机 App,大部分代码直接在 tvOS 上编译运行。只需要在 Xcode 项目的 target 里添加 Apple TV 作为支持平台。

设备发现是关键差异

03:46)Apple TV 没有内置摄像头,所以必须先发现可用设备。AVKit 提供了新的设备选择器:

SwiftUI

@State private var showDevicePicker = false

// 在 body 中
.continuityDevicePicker(isPresented: $showDevicePicker) { device in
    // device 是 AVContinuityDevice
    setActiveVideoInput(device)
}

UIKit

let picker = AVContinuityDevicePickerViewController()
picker.delegate = self
present(picker, animated: true)

// delegate 回调
func continuityDevicePicker(_ picker: AVContinuityDevicePickerViewController, 
                            didConnect device: AVContinuityDevice) {
    setActiveVideoInput(device)
}

关键点:

  • AVContinuityDevice 包含关联的 AVCaptureDevice(视频和音频)
  • 选择器列出所有登录 Apple TV 的用户的设备,支持访客配对
  • 设备连接后,也会通过 AVCaptureDeviceDiscoverySession 和 KVO 通知发布

监控设备可用性

09:58)设备可能随时断开,App 需要处理这种状态变化:

// 监听系统首选摄像头变化
AVCaptureDevice.systemPreferredCamera
// tvOS 上只有 continuityCamera 类型

用 KVO 监听 systemPreferredCamera

  • nil:没有可用摄像头
  • nil:有 Continuity Camera 可用

设备可用时启动 AVCaptureSession,设备不可用时停止会话并提示用户连接新设备。

完整的 tvOS 适配代码

11:54)演讲演示了给现有 iOS App 添加 tvOS 支持的完整过程。在 ContentView 中:

#if os(tvOS)
@State private var showDevicePicker = false
#endif

var body: some View {
    // ... existing UI ...
    #if os(tvOS)
    Button("Connect Camera") {
        showDevicePicker = true
    }
    .continuityDevicePicker(isPresented: $showDevicePicker) { device in
        activateContinuityDevice(device)
    }
    .task {
        // 如果已有设备连接,直接激活
        if let device = AVCaptureDevice.systemPreferredCamera {
            activateContinuityDevice(device)
        }
    }
    #endif
}

关键点:

  • #if os(tvOS) 编译条件隔离 tvOS 特有代码
  • .task 在视图出现时检查是否已有连接的设备
  • 按钮让用户手动触发设备选择器

麦克风 API

17:40)tvOS 17 首次支持麦克风。Audio Session 新增了对输入设备的支持:

  • playAndRecord category 和 voiceChat/videoChat mode
  • inputAvailable 属性支持 KVO,监控麦克风可用性
  • 录音权限 API 与 iOS 一致

输入设备类型:

  • Continuity Microphone:iPhone/iPad,通过 AVContinuityDevice 获取
  • Bluetooth:AirPods 或其他耳机,通过现有 Audio Session API 查询

18:55)通过 AVAudioSessionPort 识别设备类型:

let continuityDevice: AVContinuityDevice
for port in continuityDevice.audioSessionPorts {
    if port.portType == .continuityMicrophone {
        // 这是 Continuity 麦克风
    }
}

回声消除

23:32)tvOS 的回声消除比 iOS 更复杂:录音在 iPhone 上进行,播放从 Apple TV 输出到各种音响设备(电视扬声器、Sound Bar、HomePod 等),用户可能距离麦克风几英尺远。

tvOS 17 内置了新的语音处理和回声消除技术。启用方式很简单:

let engine = AVAudioEngine()
engine.inputNode.voiceProcessingEnabled = true

或者用 Audio Unit:

// AU VoiceIO with VoiceProcessingIO subtype

详细内容

存储注意事项

15:27)tvOS 的文件存储与 iOS 不同:

  • .documentDirectory 在 tvOS 上不可用,运行时会报错
  • 只能使用 .cachesDirectory
  • 缓存数据可能在 App 重启之间被清除
  • 内容创作 App 应该尽快将数据上传到云端,用完后删除本地副本

替代方案:

  • CloudKit:支持按用户存储数据
  • iCloud:多用户场景下的数据同步

交互差异

15:02)tvOS 没有触摸事件,用户通过遥控器上的方向键和按钮与系统交互。App 需要适配 Focus Engine。

Apple TV 是共享设备,支持多用户和访客。App 处理个人信息时需要考虑这一点。

录音 API 选择

API适用场景
AVAudioRecorder最简单的音频文件录制
AVCapture同时录制视频和音频
AVAudioEngine复杂音频处理(如卡拉 OK)
AudioQueue非实时录制
AudioUnit (AU RemoteIO / AU VoiceIO)直接操作实时音频 I/O

核心启发

  • 做什么:给现有 iOS 相机 App 添加 tvOS 支持

  • 为什么值得做:代码复用率极高,只需要加 Device Discovery。客厅场景打开了全新的用户群体

  • 怎么开始:在 Xcode target 里添加 Apple TV,用 #if os(tvOS) 添加设备选择器,其余捕获逻辑完全复用

  • 做什么:开发一个 tvOS 视频会议 App

  • 为什么值得做:tvOS 17 + Continuity Camera 让大屏视频会议成为可能。配合 AVAudioEngine 的语音处理,回声消除自动完成

  • 怎么开始:用 AVContinuityDevicePickerViewController 选择设备,创建 AVCaptureSession,视频输出用 AVCaptureVideoDataOutput,音频启用 voiceProcessingEnabled

  • 做什么:在直播 App 中集成 Continuity Camera

  • 为什么值得做:用户可以用 iPhone 的高画质摄像头作为直播源,在大屏上实时看到弹幕和礼物

  • 怎么开始:复用 iOS 的 AVCaptureSession 配置,添加 tvOS 特有的设备发现流程,注意处理设备断开重连

  • 做什么:给教育/健身类 App 添加 tvOS 版本,利用摄像头做动作识别

  • 为什么值得做:大屏 + 摄像头 = 全新的交互方式。健身 App 可以分析用户动作,教育 App 可以做手势互动

  • 怎么开始:用 AVCaptureMetadataOutput 获取每帧的人脸/人体检测数据,在大屏上实时反馈

关联 Session

评论

GitHub Issues · utterances