🤳

【iOS 18】DockKitのアップデート

2024/08/26に公開

DockKitはDockKit対応アクセサリを動かすためのフレームワークです。WWDC24でiOS 18から使用可能な強力なDockKit APIがいくつか追加されました。それらのAPIを使用することで、より一層DockKit対応アクセサリを柔軟に動かすことができるようになります。

本記事では、Insta360 Flow Pro & Flowを使用して、WWDC24で発表されたDockKitの新APIについて説明します。
https://www.insta360.com/jp/product/insta360-flow-pro
本記事を最後までお読みいただくことで、WWDC24で発表されたDockKitの新APIをすぐに使用することができるようになります。

DockKitに初めて触れる方は先に以下の記事をお読みいただくと、本記事をスムーズにお読みいただくことができます。
https://zenn.dev/naoya_maeda/articles/e346d80db68855

インテリジェントトラッキング


インテリジェントトラッキングとは、撮影シーンで焦点の対象を自動で判断するトラッキング方法です。iOS 18からは自動で焦点の対象を決めることができます。また、ビデオフレーム内に写っている人物や物体の特徴を取得することができるようになり、特徴に応じて焦点の対象を変更することもできます。

ビデオフレーム情報の取得


ビデオフレームに関する情報を取得することができます。取得可能なビデオフレーム情報は以下の二つです。

  • ビデオフレームをキャプチャした時刻を示すタイムスタンプ
  • ビデオフレーム内に含まれるトラッキング対象情報

DockAccessory.TrackingStates

DockAccessory.TrackingStates はトラッキングセッション状態の非同期シーケンスです。非同期で、アクティブなトラッキングセッションを表すDockAccessory.TrackingState オブジェクトを取得することができます。

DockAccessory.TrackingState

DockAccessory.TrackingState オブジェクトには、ビデオフレームをキャプチャした時刻を示すタイムスタンプや、ビデオフレームに写っている被写体情報が格納されています。

time

DockAccessory.TrackingState オブジェクトのtime で、ビデオフレームをキャプチャした時刻を示すタイムスタンプを取得することができます。

trackedSubjects

DockAccessory.TrackingState オブジェクトのtrackedSubjects で、ビデオフレームに写っているトラッキング対象情報を表すDockAccessory.TrackedSubjectType の配列を取得することができます。

トラッキング対象情報の分析


ビデオフレーム内のトラッキング対象情報の特徴を取得することができます。取得可能なトラッキング対象情報の特徴は以下の通りです。

  • 位置座標とサイズ
  • 顕著性
  • 発話確信の度合い
  • カメラ目線の度合い

DockAccessory.TrackedSubjectType

DockAccessory.TrackedSubjectType はトラッキング対象情報を表すEnum です。以下の要素を持っています。各要素のassociated Valueでトラッキング対象の特徴を取得することができます。

要素 意味
object(DockAccessory.TrackedObject) トラッキング対象がオブジェクト
person(DockAccessory.TrackedPerson) トラッキング対象が人物

DockAccessory.TrackedObject

DockAccessory.TrackedObjectDockAccessory.TrackedSubjectType の要素である、object のassociated Valueです。

identifier

トラッキングされているオブジェクトに与えられる一意の識別子です。この識別子はDockKitアクセサリがオブジェクトをトラッキングする限り持続します。後述するselectSubjects(_:) の引数にこのidentifier を渡すことで、トラッキング対象を変更することができます。

rect

トラッキングされているオブジェクトのバウンディングボックスです。CGRect 型で、バウンディングボックスの位置とサイズを表しています。

saliencyRank

トラッキングされているオブジェクトの顕著性ランクです。ランクが低いほどオブジェクトの重要性が高いと判定されています。顕著性ランキングが設定されていない場合、またはオブジェクトが顕著でない場合の値はnil になります。

DockAccessory.TrackedPerson

DockAccessory.TrackedPersonDockAccessory.TrackedSubjectType の要素である、person のassociated Valueです。

identifier

トラッキングされている人物に与えられる一意の識別子です。この識別子はDockKitアクセサリがオブジェクトをトラッキングする限り持続します。後述するselectSubjects(_:) の引数にこのidentifier を渡すことで、トラッキング対象を変更することができます。

lookingAtCameraConfidence

カメラを直接見ている人の自信を表す指標です。指標の値の範囲は0.0 から1.0 で、DockKitがスコアを計算していない場合は0.0 になります。

rect

トラッキングされている人物のバウンディングボックスです。CGRect
で、バウンディングボックスの位置とサイズを表しています。

saliencyRank

トラッキングされている人物の顕著性ランクです。ランクが低いほど人物の重要性が高いと判定されています。顕著性ランキングが設定されていない場合、または人物が顕著でない場合の値はnil になります。

speakingConfidence

トラッキング中に話している人の信頼度スコアです。指標の値の範囲は0.0 から1.0 で、DockKitがスコアを計算していない場合は0.0 になります。

トラッキング対象の選択

selectSubjects(_:)

selectSubjects(_:) でトラッキング対象を変更することができます。selectSubjects(_:) の引数には、トラッキング対象にしたいDockAccessory.TrackedPersonDockAccessory.TrackedObjectidentify を配列で指定します。

コントロールボタン


DockKit対応アクセサリに搭載されている、ボタンやホイールの変更を検知することができます。例えば、Insta360 Flow & Proにはホイールとボタンが搭載されており、それらの変更を検知することができます。

ボタンやホイールの変更を検知

DockAccessory.AccessoryEvents

DockAccessory.AccessoryEvents はDockKit対応アクセサリ側で発生したイベントの非同期シーケンスです。非同期で、はDockKit対応アクセサリ側で発生したイベントを表すDockAccessory.AccessoryEvent オブジェクトを取得することができます。

DockAccessory.AccessoryEvent

DockAccessory.AccessoryEvent はDockKit対応アクセサリ側で発生したイベントを表すEnum です。以下の要素を持っています。

要素 意味
button(id: Int, pressed: Bool) カスタムボタンで発生したアクセサリイベント
cameraFlip バックカメラとフロントカメラを切り替えるアクセサリイベント
cameraShutter シャッターを切るアクセサリイベント
cameraZoom(factor: Double) カメラズームを行うアクセサリイベント

DockAccessory.AccessoryEvents から非同期的に取得したDockAccessory.AccessoryEvent の要素をチェックし、発生したアクセサリイベントによって、実行する処理を分けることができます。

バッテリー状態の監視

DockAccessory.BatteryStates

DockAccessory.BatteryStates はiPhoneと接続中の、DockKit対応アクセサリのバッテリー状態の非同期シーケンスです。非同期でDockKit対応アクセサリ側のバッテリー状態を表すDockAccessory.BatteryState オブジェクトを取得することができます。

DockAccessory.BatteryState

DockAccessory.BatteryState はiPhoneと接続中の、DockKit対応アクセサリのバッテリー状態を表す構造体です。DockKit対応アクセサリのバッテリー状態に関するプロパティを持っています。

batteryLevel

現在のバッテリー充電率です。0..1 の範囲でバッテリー充電率を表します。

chargeState

バッテリーの充電状態を表すEnum です。

lowBattery

充電量が低いため、正常にDockKit対応アクセサリを動作させることが難しいかどうかを表します。

name

バッテリー名を表します。

おわりに

WWDC24で発表されたDockKitの新APIについて説明しました。2024/8/26時点のiOS 18 Developer Beta版では、若干動作に不安定な部分があると感じています。現時点では以下のような動作を確認しています。

iOS 18がリリースされた後に、引き続き本記事をアップデートしていきます。

参考資料

・What’s new in DockKit
https://developer.apple.com/jp/videos/play/wwdc2024/10164/

Discussion