🍎

UVCデバイスアクセス - Enterprise APIs for visionOS

2025/02/21に公開

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より購入できますが、
https://developer.apple.com/visionos/developer-strap/purchase

「Developer Strap」を入手したら、Apple Vision Proに取り付けUVC機器を接続します。「Developer Strap」はUSB-Cになるので、USB-AのWebカメラなどは変換コネクタを間に挟みます。

ここまでで事前の準備はOKです。

サンプルの実行

サンプルプロジェクトはこちら。
https://developer.apple.com/documentation/visionos/displaying-video-from-connected-devices

サンプルの動作動画はこちら。

サンプルの実行手順

先ほどのドキュメントページよりサンプルプロジェクトをダウンロードします。

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にて表示します。

DeviceManager.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として画像データが送られてきます。
何らかの処理をする場合には、このデータを利用します。

CaptureManager.swift
// 一部抜粋
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