【iOS】動かして学ぶDockKit入門
本記事は、iOSDC Japan 2024でお話しさせていただいた、「動かして学ぶDockKit入門」をテキストで要約したものになります。
DockKitについて
DockKitはDockKitデバイスをコントロールするためのフレームワークです。2023年の9月にリリースされ、iOS 17以上のiPhoneで使用することができます。DockKitデバイスは上記の写真に写っているようなデバイスです。用途としてはiPhoneでビデオ撮影を行うための、補助デバイスとして使用するものになります。
DockKit対応デバイスについて
現在世の中で販売されているDockKit対応デバイスは二つあります。
Auto-Tracking Stand Pro with DockKit
一つ目はbelkinから発売されているAuto-Tracking Stand Pro with DockKitになります。こちらは2024年3月に発売された、世界で初めてDockKitに対応したデバイスになります。iPhoneをデバイスにセットしてビデオ撮影機能を起動するだけで、人物の顔や体をトラッキングすることができます。iOS 18で追加されたボタンコントロールAPIは非対応です。
Insta360 Flow Pro
二つ目はInsta360ブランドから出ているInsta360 Flow Proになります。こちらは2024年7月に発売された、二番目のDockKitに対応したデバイスになります。こちらのデバイスの特徴は、グリップ部分にホイールとボタンがついている点です。このホイールを回したり、ボタンをタップすることで特定の動作を行うことができます。こちらはiOS 18で追加されたボタンコントロールAPIに対応しています。
DockKit対応デバイスの強み
DockKitデバイスの強みは大きく二つあります。
一つの強みは、デバイス専用のアプリが不要であることです。DockKitデバイス以外の、自動トラッキング機能を搭載したiPhone専用のデバイスを利用する時は、そのデバイス専用のカメラアプリを使用する必要があります。それに対してDockKitデバイスを使用すると、専用のアプリは不要になり、App Storeで公開されているビデオ撮影機能を搭載したアプリはもれなく全て、DockKitデバイスに対応します。
二つ目の強みは、他のフレームワークとの相性が良いということです。例えば、Vision, CoreMLを利用して、人物の顔や体以外のオブジェクトをトラッキングすることができます。その他にもAVFoundationのAPIで特定の機能を実行させたりすることもできます。
人物の顔や体のトラッキング
まずは最初に、最も基本的な動作である人物の顔や体をトラッキングするための実装です。一見難しそうに見える実装ですが、追加の実装は不要になります。
DockKitが動作する仕組み
追加の実装が不要な理由を、DockKitが動作する仕組みを用いて説明します。
iPhoneのカメラを起動中に、ビデオ撮影機能を構成するAVCapture API内部で、ビデオフレームを取得しています。
取得したビデオフレームはシステム側に送信され、システムはビデオフレームに映るコンテンツを分析します。デフォルトでは人物の顔や体を検出します。
システムは検出物の情報をもとに、Observation
を生成します。
システムはObservation
をDockKitに送信します。DockKitはObservation
に格納されている情報に基づいて、動作ベクトルコマンド(モーターをどの向きにどれくらいの大きさを回転させるかの情報)を生成し、DockKitデバイスに送信します。この一連の流れを自動で行ってくれるので、アプリ開発者は追加の実装は一切不要になっています。
カスタムコントロール
追加の実装を行わなくても人物の顔や体をトラッキングしてくれるとはいえ、DockKitにはデバイスを細かくコントロールするためのAPIが用意されています。まず、最初に主要なAPIを一つだけご紹介します。
DockAccessory
DockAccessory
はDockKit対応デバイスを表すクラスになります。DockAccessory
は、デバイスのモデル名やファームウェア情報といったハードウェア情報や、デバイスの動きをカスタマイズするためのメソッドを提供します。デバイスの動きをコントロールするためには、DockAccessory
オブジェクトのメソッドを呼び出していきます。
被写体の表示位置変更
デフォルトではビデオフレームの中央に被写体が表示されるようになっています。DockKitには被写体の表示位置を変更するためのAPIが用意されています。用意されているモードは左寄せ / 右寄せ / 中央寄せ / 自動の四つです。被写体の表示位置を変更するには、DockAccessory
オブジェクトのsetFramingMode(_:)
というAPIを使用します。引数にはFramingMode
というEnum
の要素を指定します。Enum
の要素は.automatic
、.left
、.center
、.right
と4つの要素を持っており、それぞれの要素に対応した位置に被写体を表示することができます。
また、setRegionOfInterest(_:)
というAPIで表示領域を指定して、被写体の表示位置を柔軟に変更することもできます。
カスタムトラッキング
デフォルトでは人物の顔や体をトラッキングしますが、人物の顔や体以外のオブジェクトをトラッキングすることもできます。独自のトラッキングを行う時は、Vision、Core MLを利用して生成したObservation
を利用します。カスタムトラッキングを行うには、DockAccessory
オブジェクトのtrack(_:cameraInformation:)
というAPIを使用します。
ボタンコントロール
iOS 18からはボタンコントロール用のAPIが追加されました。ジンバルについているボタンやホイールの回転イベントを取得することができます。現時点でボタンコントロールに対応しているDockKitデバイスは、Insta360 Flow Proのみとなっています。
被写体の識別
iOS 18からは被写体の識別を行うためのAPIが追加されました。ビデオフレーム内に写っている被写体の特徴や位置情報を取得することができます。被写体の特徴としては顕著性、カメラ目線の度合い、発話確信スコアになります。「顕著性」はその人がどれだけ目立っているか、「カメラ目線の度合い」はその人がどれだけカメラ目線か、「発話確信スコア」はその人がどれだけ発話しているかの可能性を表す指標になります。
まとめ
- ビデオ撮影機能を実装すれば自動トラッキングを使用可能
- 豊富なカスタムコントロール
- 他のフレームワークとの相性も良い
- iOS 18からはよりインテリジェンスな被写体識別が可能
参考資料
・Integrate with motorized iPhone stands using DockKit
・What’s new in DockKit
Discussion