ハイライト
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)。ただし、ブラウザ内でコンテンツを過度に並べ替えたり限られたスペースを混雑させると、ナビゲーションと選択能力を阻害する可能性。
重要ポイント
-
AVExperienceControllerを再生体験管理の入口に。動画再生モジュールを設計する際、AVPlayerViewControllerだけで再生せず、体験コントローラーを体験管理の中心に。後から Multiview や他新体験モード追加時の変更最小化。なぜ価値があるか: Apple は visionOS で再生体験を継続拡張(今年 Multiview、没入環境など)。体験コントローラー中心アーキテクチャで新機能への適応が速い。
始め方: 既存再生モジュールで
playerViewController.experienceControllerにアクセス。allowedExperiencesでサポートモードを明示。新規プロジェクトは設計時から体験コントローラーを抽象層に。 -
Multiview 向け軽量コンテンツブラウザを設計。システム写真の複数選択操作を参照——ユーザーは既にこのメンタルモデルを持つ。ブラウザは簡潔・直感的。サムネイルアスペクト比は実動画と一致。装飾要素最小化。
なぜ価値があるか: ブラウザは multiview コンテンツ追加/削除の主要入口。設計不備で強力機能が使いにくくなる。直感的ブラウザで multiview 認知負荷低減。
始め方:
UIViewController継承ブラウザクラス実装。リストまたはグリッドで利用可能コンテンツ表示。各項目にタイトルとサムネイル。ユーザー選択時AVMultiViewManagerで追加/削除。動画のサンプルコード参照。 -
delegate で app 状態と multiview マネージャーを同期。ユーザーが動画画面タップや再生コントロールで操作する場合、これらイベントはブラウザを経由しない——体験コントローラーの delegate で処理。
なぜ価値があるか: ユーザーは multiview と複数方法で操作。ブラウザイベントのみ監視すると状態不整合。delegate で任意遷移イベントに反応可能。
始め方: 体験コントローラーに delegate 設定。
experienceController(_:willTransitionTo:completion:)など実装。これらメソッドで app 状態更新、UI 表示/非表示、リソース準備。
関連セッション
- Enhance the immersion of media viewing in custom environments — Reality Composer Pro コンポーネントでメディア視聴没入感を強化
- Build compelling spatial photo and video experiences — 空間写真・動画の採用、立体メディアタイプの探索
- Work with windows in SwiftUI — visionOS 向け単一/複数ウィンドウ app 作成、プログラム的ウィンドウ制御
- Dive deep into volumes and immersive spaces — visionOS のボリュームと没入空間のカスタマイズ
- What’s new in Quick Look for visionOS — visionOS の Quick Look がファイルプレビュー体験をどう向上させるか
コメント
GitHub Issues · utterances