DockKit 的新变化
What's new in DockKit
2024年6月10日
一句话判断
DockKit 的 Intelligent Subject Tracking 让 iPhone 配合物理支架变成了一个自动摄像师,而且开放了 ML 信号让你在 App 里实现”追踪说话的人”这类自定义跟踪逻辑。
这场 Session 讲了什么
DockKit 是 Apple 去年推出的框架,配合第三方物理支架(现在已经可以在 Apple Store 买到)实现 iPhone 的自动追踪拍摄。今年 iOS 18 带来了 Intelligent Subject Tracking——基于机器学习的智能主体追踪。
核心升级包括:新的智能追踪管线使用 ML 模型分析身体姿态、面部朝向、注意力和说话置信度来决定应该追踪谁;Apple Watch 可以用来手动选择特定追踪对象或微调构图;新增按钮支持(物理按钮触发快门、翻转、缩放);新的相机模式(Cinematic、Timelapse、Slow-mo)支持 DockKit 追踪;电池状态监控 API。Session 重点展示了如何利用开放出来的 ML 信号(saliency rank、speaking confidence、looking at camera confidence)来实现自定义追踪逻辑。
值得深挖的点
智能追踪管线的工作原理
iOS 17 的 multi-person tracker 只能估算多个目标的轨迹,但不知道该追踪谁。iOS 18 在此基础上构建了全新的智能追踪管线:multi-person tracker 的数据先经过 Subject Selection ML Model,这个模型分析每个追踪对象的身体姿态、面部姿态、注意力方向、说话置信度,然后输出一个 saliency rank(显著性排名)——rank 1 是最重要的对象,排名数字越大越不重要。之后,subject framing 模块决定如何构图才能最美观地呈现被选中的对象。最后结合电机的位置和速度反馈计算出驱动支架的 actuator commands。
这个管线最有价值的是开放出来的 ML 信号。你的 App 可以读取每个追踪对象的 saliency rank、speaking confidence 和 lookingAtCameraConfidence。这意味着你可以构建”追踪正在说话的人”、“追踪看镜头的人”这类场景感知功能,而不是只能追踪画面中的所有人。
Apple Watch Watch Control
这是用户侧的一个大改进。通过 Apple Watch,用户可以在不触控 iPhone 的情况下精确控制追踪:点击画面中特定的人脸让 DockKit 只追踪他/她、在手表上滑动来手动移动支架、再点击选择新的追踪目标。对于视频拍摄、直播、教学等场景,这种远程控制能力很实用——你不需要走到手机前去调整追踪目标。
代码片段
读取追踪状态和 ML 信号
场景:在你的 App 中获取 DockKit 的智能追踪数据。
import DockKit
// 监听追踪状态更新
let trackingState = dockAccessory.trackingStates
for await state in trackingState {
let time = state.time
let subjects = state.trackedSubjects
for subject in subjects {
let id = subject.identifier
let faceRect = subject.faceRectangle
let rank = subject.saliencyRank
if let person = subject as? TrackedPerson {
let speaking = person.speakingConfidence
let looking = person.lookingAtCameraConfidence
// 0.0 = 不在说话/没看镜头
// 1.0 = 正在说话/看着镜头
}
}
}
坑:trackingStates 是 AsyncSequence,确保在合适的 async context 中使用。saliency rank 从 1 开始,越小越重要。
追踪说话的人
场景:自动追踪场景中正在说话的人。
import DockKit
func trackActiveSpeakers() async {
for await state in dockAccessory.trackingStates {
// 获取所有追踪到的人
let allPersons = state.trackedSubjects.compactMap { $0 as? TrackedPerson }
// 筛选说话置信度 > 80% 的人
let speakers = allPersons.filter { $0.speakingConfidence > 0.8 }
// 让 DockKit 追踪这些说话的人
if !speakers.isEmpty {
try? await dockAccessory.selectSubjects(speakers)
}
}
}
坑:selectSubjects 会替换之前的追踪目标,不是追加。如果说话的人从 2 个变成 1 个,需要重新调用。
监控电池状态
场景:在 UI 中显示 DockKit 配件的电池电量。
import DockKit
// 获取电池状态
let batteryState = await dockAccessory.batteryState
// 包含电量百分比和充电状态
// 也可以持续监听电池变化
for await state in dockAccessory.batteryStates {
updateBatteryUI(level: state.level, isCharging: state.isCharging)
}
坑:不是所有 DockKit 配件都支持电池状态查询,使用前先检查配件能力。
最佳实践
已有项目:如果你的 App 已经使用了 DockKit 的基础追踪功能,Intelligent Tracking 是自动升级的——不需要你改代码。考虑利用新开放的 ML 信号来构建差异化功能,比如”会议模式”自动追踪说话者、“健身模式”追踪看镜头的人。
新项目:对于视频会议、教育、健身、直播类 App,DockKit 的智能追踪能显著提升用户体验。接入很简单:使用标准 Camera API 就自动获得追踪能力。如果需要自定义追踪逻辑,使用 trackingStates AsyncSequence 读取 ML 信号,然后用 selectSubjects 控制追踪目标。支持物理按钮事件来提供快门、翻转、缩放功能。
还有什么值得关注
- 首批 DockKit 配件已经在 Apple Store 开售,用户配对后开箱即用。
- Cinematic、Timelapse、Slow-mo 等新的相机模式现在也支持 DockKit 追踪,之前只有 Photo 和 Video 模式。
- DockKit 配件的物理按钮支持三种事件:shutter(快门)、flip(翻转摄像头)、zoom(缩放),第三方 App 可以通过
accessoryEvent接收这些事件。