WWDC Quick Look 💓 By SwiftGGTeam
Bring Continuity Camera to your macOS app

Bring Continuity Camera to your macOS app

元の動画を見る

ハイライト

macOS Ventura と iOS 16 で Continuity Camera が導入され、Mac は iPhone のカメラを外付けカメラとして直接使えます。高品質なビデオ入力に加え、Center Stage、Studio Light、Desk View など iPhone 独自のエフェクトもサポートします。

主要内容

Mac のカメラ体験は、これまで組み込みカメラか、ユーザーが手動で接続した外付けカメラの二択にとどまることが多かったです。デバイス切断、MacBook の蓋を閉じる、より適したカメラの出現などで、App はユーザーに再選択を求めることがよくあります。

Continuity Camera は iPhone を Mac 上の外付けカメラとマイクとして公開します。macOS 13、iOS 16、同一 Apple ID、二要素認証、USB または近距離ワイヤレス接続などの条件を満たせば、iPhone は Mac のカメラ一覧に表示されます(00:40)。

既存 App にとって最も直接的な変化は、AVFoundation の標準キャプチャチェーンをすでに使っている場合、iPhone の画質、Center Stage、Portrait、Studio Light、Desk View など多くの体験が自動的に得られることです(07:58)。

この Session の焦点は、マルチカメラ環境で App をシステム App に近づけることです。システム推奨カメラを自動追従しつつ手動選択も記憶し、iPhone ビデオストリームから最大 1200 万画素の写真をキャプチャし、Desk View を独立した AVCaptureDevice として自分のキャプチャフローに組み込みます。

詳細

カメラの自動選択

08:43)macOS 13 は AVCaptureDevice に 2 つのクラスプロパティを追加しました。userPreferredCamerasystemPreferredCamera です。

userPreferredCamera は読み書き可能です。ユーザーが App 内で手動選択したとき、そのデバイスを書き込みます。AVFoundation は App ごとのユーザー設定を記憶し、接続・切断・再起動後も利用可能な提案を続けます。

systemPreferredCamera は読み取り専用です。ユーザー設定、デバイス状態、Continuity Camera の自動選択シグナルを組み合わせ、現在最適なカメラを示します。例えば iPhone が静止スタンド上で横向き、画面オフ、USB または近距離ワイヤレスで Mac に接続されているとき、Continuity Camera は自動選択されるべきシグナルを出します(10:44)。

概念例:

// Pseudocode based on the session transcript.
if automaticCameraSelectionEnabled {
    observe(AVCaptureDevice.systemPreferredCamera) { camera in
        replaceVideoInput(with: camera)
    }
}

func userDidPickCamera(_ camera: AVCaptureDevice) {
    AVCaptureDevice.userPreferredCamera = camera

    if !automaticCameraSelectionEnabled {
        replaceVideoInput(with: camera)
    }
}

キーポイント:

  • automaticCameraSelectionEnabled は App 独自の自動モードスイッチを表し、Session は手動と自動の両モード提供を推奨します(11:56)。
  • 自動モードでは systemPreferredCamera を監視し、プロパティ変化時に AVCaptureSession のビデオ入力を更新します。
  • ユーザーが手動選択したときは常に userPreferredCamera を書き込み、システムが App の設定履歴を保持します。
  • 手動モードでは systemPreferredCamera の追従を止め、ユーザー選択デバイスを直接使います。

iPhone ビデオストリームから高解像度写真をキャプチャ

14:33)Continuity Camera は iPhone の写真品質を macOS に持ち込みます。macOS 13 以前は macOS の写真キャプチャはビデオ解像度のみでしたが、Continuity Camera 使用後は最大 1200 万画素の写真をキャプチャできます。

Session の有効化フローは 2 層です。まず AVCapturePhotoOutput で高解像度キャプチャを有効化し、各撮影の AVCapturePhotoSettings で高解像度写真を有効化します。

概念例:

// Pseudocode based on the session transcript.
let photoOutput = AVCapturePhotoOutput()
photoOutput.isHighResolutionCaptureEnabled = true
photoOutput.maxPhotoQualityPrioritization = .quality

let settings = AVCapturePhotoSettings()
settings.isHighResolutionPhotoEnabled = true
settings.photoQualityPrioritization = .quality
settings.flashMode = .auto

photoOutput.capturePhoto(with: settings, delegate: photoDelegate)

キーポイント:

  • isHighResolutionCaptureEnabled はトランスクリプトの highResolutionCaptureEnabled に対応し、キャプチャ開始前に AVCapturePhotoOutput へ設定します。
  • isHighResolutionPhotoEnabled は各キャプチャの highResolutionPhotoEnabled に対応し、今回の撮影が高解像度写真を出力するかを決めます。
  • maxPhotoQualityPrioritization は出力オブジェクトが許容する最高品質優先度を制限します。
  • photoQualityPrioritization は 1 回の撮影で速度と品質のトレードオフを選びます。
  • flashMode はオン、オフ、またはシーンと光に応じた自動選択が可能です(15:58)。

顔と人体のメタデータを受信

16:14)macOS で AVCaptureMetadataOutput が使えるようになり、App は iPhone の Continuity Camera ビデオストリームから timed metadata を受け取れます。Session は face metadata objects と human body metadata objects の 2 種を明示しています。

顔メタデータ受信は単純です。session に AVCaptureMetadataOutput を追加し、サポートされるメタデータタイプを確認し、オブジェクトタイプ配列を face に設定し、delegate でリアルタイムコールバックを受けます。

概念例:

// Pseudocode based on the session transcript.
let metadataOutput = AVCaptureMetadataOutput()
session.addOutput(metadataOutput)

if metadataOutput.availableMetadataObjectTypes.contains(.face) {
    metadataOutput.metadataObjectTypes = [.face]
    metadataOutput.setMetadataObjectsDelegate(delegate, queue: metadataQueue)
}

キーポイント:

  • AVCaptureMetadataOutput() はメタデータ専用の出力を作成します。
  • session.addOutput(metadataOutput) はビデオ入出力が設定済みの capture session に接続します。
  • availableMetadataObjectTypes で現在デバイスがサポートするメタデータタイプを確認します。
  • .face は Session の顔メタデータオブジェクトタイプに対応します。
  • delegate は session 実行開始後にリアルタイムの顔メタデータコールバックを受け取ります。

Desk View を独立カメラとして使う

18:01)Desk View は Control Center から起動するシステム App だけではありません。macOS 13 は Desk View を独立した AVCaptureDevice としても公開します。

Desk View デバイスを見つける方法は 2 つです。device discovery session で Desk View camera デバイスタイプを検索するか、メインカメラの companionDeskViewCamera から対応する Desk View デバイスを取得します。後者は複数の Continuity Camera がある環境でメインカメラとデスクトップ俯瞰をペアリングするのに適しています。

概念例:

// Pseudocode based on the session transcript.
let deskViewCamera = mainCamera.companionDeskViewCamera

if let deskViewCamera {
    useWithVideoDataOutput(deskViewCamera)
    useWithMovieFileOutput(deskViewCamera)
    useWithPreviewLayer(deskViewCamera)
}

キーポイント:

  • mainCamera はすでに選択された Continuity Camera のメインビデオデバイスです。
  • companionDeskViewCamera はメインカメラとペアの Desk View デバイスを取得します。
  • Desk View デバイスは video data output、movie file output、AVCaptureVideoPreviewLayer で使えます。
  • Session によると Desk View の現在フォーマットは 420v、1920×1440、最大 30 fps です(19:00)。

重要ポイント

1. ビデオ会議 App の自動カメラモード

  • やること:カメラ選択メニューに「自動選択」スイッチを追加する。
  • 価値がある理由systemPreferredCamera は Continuity Camera の準備完了時に変化し、会議参加後の手動カメラ切り替えを減らせます。
  • 始め方:自動モードで AVCaptureDevice.systemPreferredCamera を監視し、変化時に AVCaptureSession のビデオ入力を置き換える。手動選択時は AVCaptureDevice.userPreferredCamera を書き込む。

2. Mac 文書収集ツールの高品質撮影

  • やること:Mac App で iPhone をカメラとして使い、紙の領収書、ホワイトボード、手書き草稿を撮影する。
  • 価値がある理由:macOS 13 の Continuity Camera は最大 1200 万画素の写真キャプチャをサポートし、保存と認識にはビデオフレームだけより適しています。
  • 始め方AVCapturePhotoOutput を使い、まず高解像度キャプチャを有効化し、各 AVCapturePhotoSettings で高解像度写真と品質優先度を有効化する。

3. 教育 App のデスクトップ俯瞰ビュー

  • やること:講師画面の横に Desk View を表示し、手書き、模型、楽器、手作業をデモする。
  • 価値がある理由:Desk View はメインカメラと同時利用でき、Session はメインカメラで Center Stage を有効にして顔と体の構図を安定させることを推奨します(06:52)。
  • 始め方:メイン Continuity Camera デバイスから companionDeskViewCamera を読み取り、preview layer または video data output に接続する。

4. インタラクティブ創作ツールの顔メタデータ入力

  • やること:Mac 創作 App で顔の位置に応じてレイアウト、ステッカー、録画補助線を駆動する。
  • 価値がある理由:macOS の AVCaptureMetadataOutput は iPhone ビデオストリームから顔と人体メタデータを受信できます。
  • 始め方:capture session に AVCaptureMetadataOutput を追加し、availableMetadataObjectTypes を確認後に face metadata object を購読し、delegate でリアルタイムコールバックを処理する。

関連セッション

コメント

GitHub Issues · utterances