UVCデバイスアクセス - Enterprise APIs for visionOS
Enterprise APIs for visionOS 解説シリーズ、今回は「UVCデバイスアクセス」です。
UVCとはUSB Video ClassというWebカメラやHDMIキャプチャなどUSBで画像を扱う機材のための共通規格です。
この機能を利用することで、Apple Vision Pro に外部のカメラや入力装置を接続し、画像のストリーミングやキャプチャが可能になります。
用途例としては、医療機器や建設業の重機に関連した外部モニターやカメラなどを接続し、Apple Vision Pro のアプリに取り込むことが可能です。さらに、教育現場での遠隔授業やリモートワークでのビデオ会議補助としても活用でき、より幅広いシナリオでの利用が期待されます。
外部カメラを接続して画像を取り込んでいる例
事前準備
Apple Vision Proにはデータ用のUSBポートは存在しないので「Developer Strap」を別途購入しApple Vision Proの右側に取り付けます。バッテリーのUSB-Cポートは電源ポートです。
「Developer Strap」はApple Developer Program または Apple Developer Enterprise Program のアカウント所有者がログインした状態で下記URLより購入できますが、
「Developer Strap」を入手したら、Apple Vision Proに取り付けUVC機器を接続します。「Developer Strap」はUSB-Cになるので、USB-AのWebカメラなどは変換コネクタを間に挟みます。
ここまでで事前の準備はOKです。
サンプルの実行
サンプルプロジェクトはこちら。
サンプルの動作動画はこちら。
サンプルの実行手順
先ほどのドキュメントページよりサンプルプロジェクトをダウンロードします。
zipファイルを展開して「DisplayConnectedVideo.xcodeproj」を開きます。
プロジェクトを開いたら「Enterprise.license」ファイルを差し替えます。
サンプルにはテキストファイルが入っているので、一度このファイルを削除して、取得した正規の「Enterprise.license」をプロジェクトにコピーします。
プロジェクト設定の「General」よりvisoinOSのバージョンを指定します。
サンプルではvisonOS 2.2と設定されています。
サンプルでは設定済みのためスキップしますが、「Capability」の追加として「Signing & Capabilities」より「+ Capability 」ボタンを押して「Spatial Barcode and QR code Scanning」を選択します。
ビルドして実機で実行します。
アプリが起動したら、ウィンドウ上部でデバイスの選択ができます。接続したデバイスを選択することで、そのデバイスからの映像を取得できます。
デバイス選択
選択したデバイスから映像を取得
コードの簡単な解説
接続されているデバイスの一覧は DeviceManager.swift で取得され、ContentView.swiftにて表示します。
// 一部抜粋
init() {
// キャプチャーマネージャーの作成
captureManager = CaptureManager(videoRenderer: preview.sampleBufferRenderer)
// ビデオアクセスの許可
initialAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
Task {
if initialAuthorizationStatus == .notDetermined {
await AVCaptureDevice.requestAccess(for: .video)
initialAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
}
}
Task {
// デバイスリストの更新をモニタ
for await devices in connectionManager.devices {
self.devices = devices
}
}
}
デバイスから画像のストリームが開始されると、CMSampleBufferとして画像データが送られてきます。
何らかの処理をする場合には、このデータを利用します。
// 一部抜粋
extension CaptureManager: AVCaptureVideoDataOutputSampleBufferDelegate {
nonisolated func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
// 画像サンプルをキューに入れる
if videoRenderer.isReadyForMoreMediaData {
videoRenderer.enqueue(sampleBuffer)
}
}
}
まとめ
事前の準備や運用が少し手間ですが、外部デバイスからの映像入力が可能になります。
これにより、映像を含めた情報を Apple Vision Pro に集約し、アプリ内で完結できるようになります。例えば、医療分野での手術映像のモニタリング、建設現場でのリアルタイム映像分析、遠隔監視システム、映像解析を活用した AI 支援診断アプリなど、さまざまな業務用途に応用可能です。
Discussion