WWDC Quick Look 💓 By SwiftGGTeam
Explore multiview video playback in visionOS

Explore multiview video playback in visionOS

元の動画を見る

ハイライト

Multiview は Vision Pro 上で最大 5 つの動画画面を同時再生可能。システムがレイアウトテンプレートを自動管理。各画面は独立した AVPlayerViewController が駆動。


主要内容

こんなシーンを想像: スポーツ試合を見ながら、別の進行中試合も追いたい。複数ストリーマーのライブを見て、全画面を同時に見たい。コンテンツ自体がマルチカメラ視点を提供し、角度を切り替えたい。これらの核心ニーズ: 複数画面を同時視聴し、フォーカスを切り替える。

visionOS 今年導入の Multiview がこれに対応。核心アプローチはシンプル: 各動画画面の背後に独立 AVPlayerViewController。システムが快適なレイアウトに配置。ユーザーは app カスタムのコンテンツブラウザで動画追加。画面タップでフォーカス切替。ドラッグで位置調整。

Multiview は最大 5 画面同時再生。画面数に応じてシステムが最適レイアウトテンプレートを自動選択。追加/削除、並べ替え、サイズ調整可能。ある画面が「主フォーカス」状態では、その音声が優先再生。コントロールはその画面に応答。一部設定(音量など)は全画面に適用。他(再生速度など)は現在画面のみ。

開発者にとって重要なのは 3 クラスの協調関係: AVPlayerViewController が個別動画再生、AVExperienceController が体験モード切替(embedded/expanded/multiview)管理、AVMultiViewManager が Multiview モードに入る全画面管理。実装の核心: カスタムブラウザ View Controller とコンテンツ選択 UI を提供。


詳細

Multiview 実装は 3 つのコアクラス協調に依存。まず各動画画面は独立 AVPlayerViewController が駆動。このコントローラーに新しいペアクラス: AVExperienceController。体験コントローラーがプレイヤーが切替可能な体験モードを定義: embedded(動画と app コンテンツ並列表示)、expanded(動画画面単独表示)、multiview。

あるプレイヤーで Multiview を有効にするには、体験コントローラーの allowedExperiences.multiView を追加。プレイヤー UI にマルチビューボタン表示。タップで体験コントローラーが multiview 体験に切替。コンテンツ選択ブラウザ表示。体験開始を示す。

コンテンツ選択ブラウザは app カスタム View Controller。利用可能コンテンツ管理と選択 UI 提供。AVMultiViewManager にアタッチ。このマネージャーが多くの詳細を処理: 必要時にブラウザ UI 活性化、multiview モードに入った体験コントローラー追跡、動画画面レイアウト維持。

ブラウザビューコントローラーとマルチビューマネージャーが協調してコンテンツ追加/削除。ユーザーがブラウザ UI で追加コンテンツ選択時、シグナルでブラウザビューコントローラーが別 AVPlayerViewController を作成。その体験コントローラーが進行中 multiview 体験に切替。マルチビューマネージャーが multiview に入った体験コントローラーセットを追跡。動画画面レイアウトを更新。

以下セットアップコード。

コンテンツブラウザの設定

カスタムブラウザビューコントローラーをマルチビューマネージャーに設定(07:47):

import AVKit

AVMultiViewManager
    .default
    .contentSelectionViewController = multiViewController()

キーポイント:

  • AVMultiViewManager.default はシングルトン。app 全体の multiview 体験を管理
  • contentSelectionViewController は早めに設定。マネージャーが必要時にブラウザ UI を活性化
  • このビューコントローラーが利用可能コンテンツ表示とユーザー選択を処理

マルチビューへのコンテンツ追加

ユーザーがコンテンツ選択後、新プレイヤー作成して multiview に参加(08:09):

import AVKit

let controller = AVPlayerViewController()

let experienceController = controller.experienceController
experienceController.allowedExperiences = .recommended(including: [.multiView])

await experienceController.transition(to: .multiView)

キーポイント:

  • AVPlayerViewController 作成。ただしビューはまだ階層に未追加
  • experienceController はプラットフォームデフォルト体験モードで開始
  • .recommended(including:) は推奨体験 + 指定追加体験を含む
  • transition(to:) でマネージャーが引き継ぎ。動画を multiview レイアウトに追加

マルチビューからのコンテンツ削除

ユーザーがブラウザ経由でコンテンツ削除時、体験を別モードに切替(08:47):

import AVKit

let experienceController =

await experienceController.transition(to: .embedded)

キーポイント:

  • 削除時体験コントローラーは既に multiview モード
  • .embedded へ切替で multiview レイアウトから動画削除
  • 対応プレイヤービューコントローラーがビュー階層に未インストールなら、マネージャーが直接非表示

ブラウザ外イベントの処理

コンテンツブラウザ以外にも、ユーザーは multiview と他の方法で操作——動画画面タップ、再生コントロール経由で multiview 退出。AVExperienceController の delegate で処理(09:19)。

delegate は発生方法に関わらず全遷移イベントを受信。各遷移進行のコンテキスト付き。単一画面プレイヤーの multiview ボタンタップ時、体験コントローラーが multiview に切替。delegate が通知。app が反応可能。ユーザーが動画画面タップまたは再生コントロールで multiview 完全退出時も delegate が遷移イベント受信。

delegate は遷移開始前に追加作業完了の機会も(10:11)。app が状態準備、関連 UI 表示/非表示、滑らかな遷移準備の機会。

ベストプラクティス

段階的体験: Multiview は強力だが、期待していないユーザーには圧倒的。優雅な段階的体験サポートが鍵。馴染みの単一画面視聴から開始。さらに進みたい人に multiview を提案。AVPlayerViewController 提供の標準ボタン使用。multiview 探索後も単一画面を好む人がいる——その場合も同等の良い体験を提供(10:46)。

コンテンツ選択: Multiview は同時進行コンテンツ視聴に適し、1 つを主に強調。ドラマシリーズを連続視聴するようなケースには不向き——AVQueuePlayer を検討(11:21)。強いユースケースがなければ、他 AVKit オプションで適切体験を探索。

コンテンツブラウザ設計: コンテンツブラウザは追加/削除の主要手段。直感的で、期待を明確に、見たいコンテンツを素早く見つけられること。タイトルとサムネイルプレビューで各項目を簡潔に記述(12:10)。ブラウザ領域は動画画面に比べ限定的。装飾最小化。識別しやすい要素に集中。全体スタイルは体験他部分と一致。サムネイルアスペクト比はコンテンツ再生時と一致。適切ならアクセントカラーも一致。ブラウザや選択を過度強調しない——全体体験を阻害。

現在選択を強調。利用可能コンテンツの一部しか視聴しない人も——ブラウザで画面上のコンテンツを識別支援(12:46)。ただし、ブラウザ内でコンテンツを過度に並べ替えたり限られたスペースを混雑させると、ナビゲーションと選択能力を阻害する可能性。


重要ポイント

  1. AVExperienceController を再生体験管理の入口に。動画再生モジュールを設計する際、AVPlayerViewController だけで再生せず、体験コントローラーを体験管理の中心に。後から Multiview や他新体験モード追加時の変更最小化。

    なぜ価値があるか: Apple は visionOS で再生体験を継続拡張(今年 Multiview、没入環境など)。体験コントローラー中心アーキテクチャで新機能への適応が速い。

    始め方: 既存再生モジュールで playerViewController.experienceController にアクセス。allowedExperiences でサポートモードを明示。新規プロジェクトは設計時から体験コントローラーを抽象層に。

  2. Multiview 向け軽量コンテンツブラウザを設計。システム写真の複数選択操作を参照——ユーザーは既にこのメンタルモデルを持つ。ブラウザは簡潔・直感的。サムネイルアスペクト比は実動画と一致。装飾要素最小化。

    なぜ価値があるか: ブラウザは multiview コンテンツ追加/削除の主要入口。設計不備で強力機能が使いにくくなる。直感的ブラウザで multiview 認知負荷低減。

    始め方: UIViewController 継承ブラウザクラス実装。リストまたはグリッドで利用可能コンテンツ表示。各項目にタイトルとサムネイル。ユーザー選択時 AVMultiViewManager で追加/削除。動画のサンプルコード参照。

  3. delegate で app 状態と multiview マネージャーを同期。ユーザーが動画画面タップや再生コントロールで操作する場合、これらイベントはブラウザを経由しない——体験コントローラーの delegate で処理。

    なぜ価値があるか: ユーザーは multiview と複数方法で操作。ブラウザイベントのみ監視すると状態不整合。delegate で任意遷移イベントに反応可能。

    始め方: 体験コントローラーに delegate 設定。experienceController(_:willTransitionTo:completion:) など実装。これらメソッドで app 状態更新、UI 表示/非表示、リソース準備。


関連セッション

コメント

GitHub Issues · utterances