View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

  • 概要
  • トランスクリプト
  • コード
  • visionOSアプリでのイマーシブなビデオ再生のサポート

    visionOSアプリでイマーシブなビデオを再生する方法を学びましょう。各種のイマーシブなレンダリングモードとそれらをサポートするフレームワークを紹介し、イマーシブなビデオをアプリでレンダリングする方法について説明します。このビデオの内容を十分理解できるよう、最初に、WWDC25の「Explore video experiences for visionOS」を視聴することをおすすめします。

    関連する章

    • 0:00 - イントロダクション
    • 1:24 - visionOS 26でサポートされるビデオプロファイル
    • 3:09 - クイックルックでのイマーシブなビデオの再生
    • 4:25 - AVKitによるイマーシブなビデオの再生
    • 9:11 - 不快感緩和のための検出
    • 9:51 - RealityKitでのカスタム再生
    • 11:48 - RealityKitでの段階的イマーシブモード
    • 16:32 - RealityKitによる空間ビデオのレンダリング
    • 21:16 - RealityKitでの不快感緩和のための検出
    • 22:57 - RealityKitコンテンツのSwiftUIとの統合

    リソース

    • AVFoundation
    • AVKit
    • HTTP Live Streaming Examples
    • Playing immersive media with AVKit
    • Playing immersive media with RealityKit
    • RealityKit
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • 空間Webの新機能
    • Apple Immersive Videoテクノロジーについて
    • Apple Projected Media Profileについて
    • visionOSのビデオ体験の詳細

    WWDC24

    • ボリュームとイマーシブな空間の詳細

    WWDC23

    • RealityKitによる空間コンピューティンングアプリの拡張
  • このビデオを検索

    こんにちは AVKitチームのメディア アプリケーションエンジニア Jamalです visionOS Spatial Mediaチームの ソフトウェアエンジニア Michaelです visionOSで好きなことの1つは このプラットフォームに固有の方法で ビデを見ることです visionOS 2では ドック再生や 空間ビデオなどのすばらしい 体験が含まれます visionOS 26では クイックルック AVKit、RealityKitなどの おなじみのメディア フレームワークが拡張され よりイマーシブなメディアプロファイルに 対応することで visionOSで優れた イマーシブなビデオ再生体験を 生み出すことができます 本日は Jamalと私で 皆さんのアプリでこのイマーシブな ビデオ再生に対応する方法を紹介します Jamal お願いします ありがとう Michael まず 様々な種類の ビデオプロファイルを簡単に確認します 次に クイックルックや AVKitの新しいAPIで イマーシブメディア再生を サポートする方法を紹介します 最後に Michaelが RealityKitを使用して アプリでイマーシブ再生体験を カスタマイズする方法を説明します このビデオを見れば visionOSアプリでの イマーシブビデオ再生体験の サポートや創造に必要な すべての知識を 身につけることができます まず visionOS 26で対応している 様々な種類のビデオプロファイルを 見ていきましょう

    visionOS 1では アプリ内でのビデオ再生は主に2Dビデオと 3Dビデオによって提供されていました 空間メディアにより 人々は 魅力的なステレオコンテンツを撮影し イマーシブな方法で 楽しむことができました visionOS 26には 180度、360度、広視野角の ビデオに対応した Apple Projected Media Profile (APMP)が導入されました 究極のイマーシブ体験を実現するには Apple Immersive Videoがあります これらの各プロファイルには それぞれの特長があります これらの用語になじみがない場合は 「Explore video experiences for visionOS」セッションをご覧ください 先ほど挙げたビデオプロファイルを サポートする方法は様々です そのため アプリに最適な テクノロジーを選択することが 特別なイマーシブ体験を 提供するうえで重要です

    クイックルックは イマーシブメディアを 含むあらゆるメディアをすばやく表示するのに 最適なフレームワークです AVKitは どのプラットフォームでも わかりやすく一貫性のあるビデオ体験を 提供する一方で 再生コントロールも 強化されています RealityKitは ビデオゲーム環境などの 他に類を見ないイマーシブ再生体験が 求められるアプリ向けに 設計されています 最後に ブラウザでのイマーシブ再生の サポートが必要な場合は 「What's new for spatial web」 セッションをご覧ください Webコンテンツのイマーシブ再生について 詳しく説明しています

    次に visionOS 26のクイックルックと AVKitで使用できるツールを紹介します これにより イマーシブビデオ再生 アプリの作成をすぐに 始められます クイックルックには メディアをすばやく 表示・プレビューできるAPIが2つあります PreviewApplicationは メディア表示の外部プロセス ウインドウを有効にするAPIです QLPreviewControllerは アプリの ウインドウ内またはモーダル表示スタイルで メディアをプレビューするためのAPIです visionOS 26では QLPreviewControllerは 空間写真と 空間ビデオに対応するように強化されました さらに PreviewApplicationは Apple Immersive Videoと Apple Projected Media Profileに対応し 180度、360度、広視野角の ビデオも処理できます

    QLPreviewControllerと PreviewApplicationは 新しいビデオプロファイルの表示や 切り替えを管理できます また 適切なビデオスタイルに プレビューを調整します visionOS 26では 既にQuick Look APIを 実装しているすべてのアプリは イマーシブメディアプロファイルを 自動的にサポートします PreviewApplicationや QLPreviewController APIを 実装する方法については WWDC23のビデオ「Discover Quick Look for spatial computing」と WWDC24の「What's new in Quick Look for visionOS」をご覧ください 次に イマーシブビデオ再生を完全に サポートするために導入された 新しいAVKit APIを紹介します visionOS 26では AVExperienceController APIを活用して 新しいイマーシブ体験への 切り替えを実現しています イマーシブ体験への切り替えを 実現するために AVExperienceControllerには 様々なオプションがあります 最初のオプションはExpandedです Expanded体験では AVPlayerViewControllerが UIウインドウのシーン全体を 使用して表示され visionOS 26では Expandedの構成によって イマーシブビデオ再生を実現できます Expanded構成では新たに AutomaticTransitionToImmersive プロパティが追加され これを使用して イマーシブ体験への自動切り替えを 行うかどうかを制御できます AutomaticTransitionToImmersive プロパティの値は システムのデフォルトの動作を 優先する場合はdefaultに 自動切り替えが不要な場合は noneに設定します

    AutomaticTransitionToImmersive プロパティの値として noneを設定すると AVPlayerViewControllerは イマーシブコンテンツが検出された ときにポータル表示として処理します Expandedのままで AVExperienceControllerを使用する場合 イマーシブ体験への自動切り替えを 無効にすることで イマーシブコンテンツをポータル表示 として処理できます まず AVPlayerViewControllerを 作成し イマーシブメディアコンテンツを設定します 次に そのexperienceControllerに プラットフォームに適した 推奨設定を追加します これには Expandedや Immersiveも含まれています AutomaticTransitionToImmersive プロパティの 初期値はdefaultなので ここで値に.noneを指定しておく 必要があります AVPlayerViewControllerが 既にアプリの ビュー階層にある場合 AVExperienceControllerを Expanded体験に 切り替える準備は完了です AVExperienceControllerのExperiencesに 含まれる新しいImmersive APIを使用すると 自動トリガーに頼らず 明示的にイマーシブ体験に 切り替えることが 可能になりました Expandedと同様に

    このイマーシブ体験APIにも 新しい構成用APIが追加され イマーシブビデオを再生する場所を アプリ側で指定できるようになりました このコードスニペットは Immersive体験をConfiguration APIと 組み合わせて使用する方法を示しています AVPlayerViewControllerがビュー階層に 追加されていない場合は Configuration APIでこれを 指定する必要があります これを行うには Experience Controllerの Configurationにアクセスし 希望するウインドウの UIシーンに対して .over関数で配置を指定します 定義が完了すると AVExperienceControllerは イマーシブ体験への切り替えができます AVPlayerViewControllerが既に ビュー階層に含まれている場合 AVExperienceControllerは それが含まれているウインドウシーンを 目的の配置シーンとして認識します このようにして アプリは AVKitでイマーシブ体験に 切り替えることができます イマーシブ体験との切り替えの際には AVExperienceControllerが アニメーションと 体験間の切り替えを処理します これらの切り替えは ユーザーの操作、アプリのロジック またはシステムによって いつでも開始されます

    したがって AVExperienceControllerを使用する際は 切り替えや表示状態の変化を 理解しておくことが重要です これにより アプリのアクティブ状態を 柔軟に処理できるようになります この場合は AVExperienceControllerの Delegateプロトコルを使って解決します このプロトコルには 3つのデリゲートメソッドがあります didChangeAvailableExperiencesは 利用可能な体験モードが 変更されたときに通知します prepareForTransitionUsingは AVExperienceControllerが 切り替えを開始する直前に通知し アプリが新しい状態に備え 最終準備ができるようにします didChangeTransitionContextは 新しい体験への切り替えが 完了したときに通知します

    体験としてのImmersiveの可否は提供される コンテンツの種類によって異なります didChangeAvailableExperiences メソッドを使用して 現在のコンテンツでイマーシブ体験が 利用可能かどうかを確認できます 例えば AVPlayerViewControllerに 2Dメディアコンテンツを指定した場合 イマーシブ体験は利用できません AVExperienceControllerと そのデリゲートメソッドの 使用方法について詳しくは 「Playing immersive media with AVKit」 のサンプルコードをご覧ください イマーシブビデオ再生用の 新しいAPIに加えて クイックルックとAVKitは visionOS 26で 快適性低下の検出に対応するようになりました イマーシブビデオではカメラの 動きが激しくなることがあり 視聴者に不快感を与える可能性があります この問題に対処するために Apple Projected Media Profile コンテンツで動きの検出がサポートされました クイックルックやAVKitは 再生中の ハイモーションを検出し 自動的に イマーシブレベルを下げます 視聴者は設定アプリで オプションを調整でき クイックルックとAVKitの動作を 視聴者の好みに合わせて変更できます ほとんどのイマーシブビデオ 再生体験には クイックルックとAVKitが最適です よりカスタムなイマーシブ体験には RealityKitが理想的な選択肢です その理由はMichaelに説明してもらいましょう ありがとう Jamal 私もRealityKitがカスタムビデオ再生に 最適なフレームワークであると思います 例えば イマーシブなゲームに ビデオを組み込んだり カスタムユーザーインターフェイスで ビデオを表示したりする場合です visionOS 26では RealityKitはイマーシブ ビデオのネイティブ再生をサポートします このセクションでは 180度、360度 広視野角ビデオ向けの 新しい段階的イマーシブモードと Apple Immersive Video さらにPhotosアプリのような 完全な空間スタイリングによる 空間ビデオレンダリングについて 説明します また ビデオの不快感緩和を適用する タイミングを検出する方法も示します 最後に SwiftUIシーン内で RealityKitを使用してビデオを 再生するためのヒントも紹介します VideoPlayerComponentは RealityKitで ビデオを描画するための強力なAPIです RealityKitのエンティティにアタッチすると AVPlayerの現在のビデオと コンポーネントのプロパティに基づいて 独自のメッシュとマテリアルを生成します そのため VideoPlayerComponentは イマーシブ表示モードでビデオを レンダリングするのに最適です メッシュの更新とアニメーションが 自動的に処理されるため developer.apple.com/jpの Destination Videoプロジェクトのビデオの ドッキングの例のような使い方ができます VideoPlayerComponentの 概要については 「Enhance your spatial computing app with RealityKit」をご覧ください

    visionOS 26では VideoPlayerComponentが クイックルックやAVKitと同様に すべてのイマーシブビデオプロファイルに 対応するようになりました Apple Projected Media Profileビデオと Apple Immersive Videoから見ていきます VideoPlayerComponentはこれらに対して 3つのイマーシブモードをサポートしています ポータルモードでは ウインドウ表示用の ポータルにビデオが描画されます プログレッシブモードは新しいAPIで ユーザーはDigital Crownを使って イマーシブレベルを調整でき 周囲の世界とのつながりを維持しながら 引き続きビデオを楽しむことができます 100%のイマーシブ状態では プログレッシブモードは完全な イマーシブ表示モードと同等になります

    visionOS 26以降 Apple Projected Media Profileビデオと Apple Immersive Videoでは プログレッシブイマーシブ表示モードは 完全イマーシブ表示モードよりも優先されます これは より柔軟な処理が 可能になることに加え 不快感の緩和にも対応しているためです これについては後で詳しく説明します ここでは ポータルモードで180度の ビデオをレンダリングするビューを作成し それを共有スペースの WindowGroupに配置します ポータル再生を構成するには まず ローカルURLまたはHTTP ライブストリーミングURLを使用して AVPlayerItemと AVPlayerを作成します 次に playerを使って VideoPlayerComponentを初期化します そのdesiredImmersiveViewingModeを portalに設定し そのコンポーネントを エンティティにアタッチします VideoPlayerComponentのメッシュの 高さはデフォルトで1 mです SwiftUIウインドウシーンに収まるように ビデオを0.4 mにスケール変更します 最後に エンティティをシーンに追加します このビデオをプログレッシブモードで レンダリングするには コンポーネントの desiredImmersiveViewingModeを portalからprogressiveに変更します プログレッシブモードではコンポーネントが スケールを制御するため スケール操作は効果がありません 明確にするために このスケール設定は削除します ただし コンポーネントを progressiveに更新するだけでは SwiftUIシーン内で レンダリングするには不十分です メッシュが拡張されたときにウインドウ シーンの境界と干渉しないようにするため 新しいProgressiveVideoViewを ImmersiveSpaceに配置する必要があります プログレッシブモードで レンダリングする場合は ImmersiveSpaceにprogressiveイマーシブ スタイルが設定されている必要があります ここで 初期イマーシブレベルは1で 完全なイマーシブ状態と同等です 10%から100%まで幅広い範囲を選択したのは ユーザーが好みのイマーシブレベルに 調整できるようにするためです 0%を含めると コンテンツが消えるまで イマーシブレベルを下げることができ このアプリで望ましい動作 ではなくなります 再生の構成では SwiftUIの ImmersionStyleとコンポーネントの イマーシブ表示モードの両方が重要です RealityViewでレンダリングする場合 常にdesiredImmersiveViewingModeと ImmersionStyleを一致させる必要があります イマーシブスタイルの 詳細については 2024年のビデオ「Dive deep into volumes and immersive spaces」をご覧ください SwiftUIのシーンを切り替える際に ポータルモードからプログレッシブモードへの 移行には ImmersiveViewingModeDidChange イベントの発生を待つ必要があります ImmersiveViewingModeWillTransition イベントとDidTransitionイベントは アニメーションによる切り替えの際にUIの 表示と非表示を切り替えるタイミングを通知し 動きとステレオ表示の不快感を軽減します これらのイベントの実例については developer.apple.com/jpにある「Playing immersive media with the RealityKit」の サンプルコードをご覧ください Apple Projected Media Profile ビデオとApple Immersive Videoの ポータルレンダリングの場合は desiredImmersiveViewingModeを portalに設定します ポータルは通常 SwiftUIのWindowGroupを 使用して共有スペースに配置されますが イマーシブスタイルが混在している イマーシブ空間に排他的にも配置できます イマーシブレンダリングの場合 desiredImmersiveViewingModeを progressiveに設定し 前のコードのように ImmersionStyleがprogressiveに設定された ImmersiveSpaceに配置します システムの推奨動作を実現するには desiredViewingModeを設定しないでください viewingModeは モノスコピック ビデオの場合は自動的にモノに ステレオ180度やApple Immersive Videoなど のステレオビデオの場合はステレオになります 空間ビデオは 皆さんのような方々であれば 既にAppleのエコシステム全体で 撮影をしているかもしれません 空間ビデオには空間メタデータが含まれ より快適でイマーシブな描画ができます Apple Projected Media Profileビデオや Apple Immersive Videoと同様に 空間ビデオは RealityKitで ネイティブにサポートされるようになり 完全な空間スタイリングと イマーシブモードでレンダリングされます

    空間ビデオの空間スタイリングに 使用するのは VideoPlayerComponentの desiredSpatialVideoModeプロパティです このプロパティを設定することで 空間ビデオのレンダリング方法を指定します 現在どのようにレンダリング されているかを確認するには 取得専用のspatialVideoMode プロパティを読み取ります 空間ビデオに空間スタイリングを 適用するには desiredSpatialVideoModeを .spatialに設定します

    空間レンダリングは .portalと.fullの両方の ImmersiveViewingModeをサポートしています 他のイマーシブビデオとは異なり 空間ビデオのイマーシブレンダリングは 常にフルイマーシブ表示モードで 構成されています イマーシブ空間ビデオは コンテンツの視野角に基づいて 固定サイズでレンダリングされます

    desiredSpatialVideoModeを デフォルト値の.screenに設定すると 空間ビデオは スクリーンメッシュ上に 従来のステレオ形式でレンダリングされます SpatialVideoModeは 現在のビデオが 有効な空間ビデオでない限り 更新されません 名前が示すように このモードは 空間ビデオにのみ適用されます 新しいVideoPlayerEventの SpatialVideoModeDidChangeの受信登録か spatialVideoModeプロパティの監視により SpatialVideoModeプロパティが更新 されたかどうかやそのタイミングを判定します

    ポータルモードで空間ビデオを レンダリングするには まず 空間ビデオを保持するAVPlayerを使用 してVideoPlayerComponentを作成します desiredViewingModeをstereoに設定します これは空間ビデオのデフォルトですが ここでは明示的に指定します 次に desiredSpatialVideoModeを spatialに設定し desiredImmersiveViewingModeとして portalを選択します 先ほどと同様に ウインドウ内に 収まるようにビデオをスケーリングします 空間モードでは イマーシブ表示モードを fullに設定することでビデオを拡張できます スケーリング操作も削除します これは イマーシブ表示では コンポーネントがサイズを制御するためです 先ほどの例と同様に クリッピングを避けるために ビューは ImmersiveSpace内に配置する必要があります ただし イマーシブ空間ビデオレンダリングは 他のイマーシブビデオとは異なり ヘッドロックされないためエンティティの 位置を手動で設定する必要があります 床から1.5メートル上で 前方1メートルの位置を選びます ただし より堅牢な手法としては ヘッドアンカーを使って エンティティの 初期位置をユーザーの正面に設定します 最後に このImmersiveSpatialVideoViewを ImmersiveSpaceでラップします 空間ビデオでは イマーシブモードを パススルーでレンダリングするために ImmersionStyleをmixedに設定します 空間ビデオをシステム環境でも レンダリングできるようにするには これは私が常に望んでいる動作ですが 新しいimmersiveEnvironmentBehaviorシーン 修飾子をcoexistオプションと共に使用します

    まとめると 空間ビデオのポータルは desiredSpatialVideoModeをspatialに desiredImmersiveViewingModeを portalに設定することで構成でき 共有スペースでも ImmersionStyleがmixedに 設定されたImmersiveSpaceでも表示できます 空間ビデオでは 表示モードは デフォルトでステレオになります イマーシブモードの空間ビデオでは desiredImmersiveViewingModeをfullに ImmersiveSpaceのImmersionStyleを mixedに設定して パススルーで レンダリングします

    空間スタイリングなしで 従来の ステレオ形式でレンダリングするには desiredSpatialVideoModeを screenに設定します このモードでは イマーシブ表示 モードは効果がありません 空間ビデオは desiredViewingModeをmonoに設定することで モノスコピック表示でレンダリングできます このモードでは SpatialVideoModeも ImmersiveViewingModeも効果がありません これらの非イマーシブモードは 通常 WindowGroupの共有スペースに表示されます イマーシブビデオを視聴することは 本当にイマーシブ体験です つまり 映像に激しい動きがあると 再生は非常に敏感に反応する可能性があります Apple Projected Media Profileビデオでは RealityKitが 再生中に不快感の 緩和を自動的に実行します 先ほどJamalが AVKitと クイックルックで説明したことと同じです

    新しいVideoComfortMitigationDidOccur イベントは 映像内の激しい動きに応じて システムが不快感の緩和を 適用したときに通知します このイベントの受信した際に 特別な処理は必要ありません それは単に 特定の不快感の 緩和処理が適用されたという通知です reducedImmersionの不快感緩和処理は プログレッシブレンダリングでのみ有効です そのため Apple Projected Media Profile ビデオでは fullの代わりにプログレッシブ イマーシブ表示モードとイマーシブ スタイルを使用することが重要です ポータルレンダリングでは 不快感緩和は発生しません ポータル再生は ほとんどの コンテンツで既に快適だからです VideoPlayerComponentの対応する動作と レンダリングスタイルは 表示されるビデオの プロファイルによって異なります ContentTypeDidChangeイベントを使用して VideoPlayerComponentで ビデオの種類を検出します これには Apple Projected Media Profile ビデオなどの新しい種類も含まれます ビデオの種類が変更されたときは 即座に反応し 利用可能な表示モードの判定や 不快感緩和が適用されるかどうかの確認 UI要素の更新を行います VideoPlayerComponentを UIと組み合わせる場合や 単にSwiftUIのシーンに表示する場合は RealityKitコンテンツとSwiftUIを円滑に 統合するためのヒントがいくつかあります 例えば メディアをUIと一緒に配置するには メッシュのスケール管理が重要です ポータルモードでは メッシュのサイズは playerScreenSizeプロパティによって エンティティの ローカル座標空間に反映されます ポータルメッシュは常に 高さ1メートルで作成されます ビデオエンティティをスケーリングする場合 アスペクト比を維持するために 常にX軸とY軸を均一にスケーリングします ウインドウシーンの高さが 1メートル未満の場合 メッシュはシーンの 境界によってクリップされます ただし エンティティのサイズを 縮小すれば回避できます シーン内に収まるように ビデオをスケーリングするには GeometryReader3Dで 利用可能なウインドウ サイズに基づいてスケールを設定します developer.apple.com/jpにある「Playing immersive media with RealityKit」 サンプルプロジェクトでは シーンに合わせてビデオポータルを スケーリングする例が示されています

    また 注意する点として カスタムUIがビデオメッシュと同じ平面に 配置される場合 描画順は未定義になります ModelSortGroupComponentを VideoPlayerComponentと同じ エンティティに追加し planarUIPlacement カテゴリを指定するModelSortGroupで エンティティと同一平面上のUIの 描画順序を明示的に指定します クイックルック AVKit、RealityKitのいずれを イマーシブビデオ再生のフレームワーク として選択するかは皆さん次第です これらのすばらしい体験をアプリに 組み込むためのツールは揃っています

    アプリに新しいイマーシブ体験を 追加してください イマーシブゲームに 360度APMPビデオを追加したり Apple Immersive Videoや空間ビデオを ストリーミングしたりしてみましょう 新しいAPMPビデオタイプを掘り下げるには ビデオ「Learn about the Apple Projected Media Profile」をご覧ください Apple Immersive Videoの 詳細については ビデオ「Learn about Apple Immersive Video technologies」をご覧ください さあ 驚きのイマーシブビデオ体験を 創造しましょう

    • 5:03 - AVExperienceController - AutomaticTransitionToImmersive

      struct ExpandedConfiguration {
          enum AutomaticTransitionToImmersive {
        		case `default`
        		case  none
          }
      }
    • 5:50 - Disable Automatic Transitions to immersive

      import AVKit
      
      let controller = AVPlayerViewController()
      
      let experienceController = controller.experienceController
      experienceController.allowedExperiences = .recommended(including: [.expanded, .immersive])
      
      experienceController.configuration.expanded.automaticTransitionToImmersive = .none
      
      await experienceController.transition(to: .expanded)
    • 6:26 - AVExperienceController - Immersive

      enum Experience {
          case immersive
      }
      
      struct Configuration {
      		struct Placement {
      			static var unspecified: Placement
      			static func over(scene: UIScene) -> Placement
      		}
      }
    • 6:53 - Transition to immersive

      import AVKit
      
      let controller = AVPlayerViewController()
      
      let experienceController = controller.experienceController
      experienceController.allowedExperiences = .recommended(including: [.immersive])
      
      let myScene = getMyPreferredWindowUIScene()
      experienceController.configuration.placement = .over(scene: myScene)
      
      await experienceController.transition(to: .immersive)
    • 8:13 - AVExperienceController.Delegate

      func experienceController(_ controller: AVExperienceController, didChangeAvailableExperiences availableExperiences: AVExperienceController.Experiences)
      
      func experienceController(_ controller: AVExperienceController, prepareForTransitionUsing context: AVExperienceController.TransitionContext) async
      
      func experienceController(_ controller: AVExperienceController, didChangeTransitionContext context: AVExperienceController.TransitionContext)
    • 12:52 - PortalVideoView

      @main
      struct ImmersiveVideoApp: App {
          var body: some Scene {
              WindowGroup {
                  PortalVideoView()
              }
          }
      }
    • 13:03 - Portal Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalVideoView: View {
          var body: some View {
              RealityView { content in
                  guard let url = URL(string: "https://cdn.example.com/My180.m3u8") else { return }
                  let player = AVPlayer(playerItem: AVPlayerItem(url: url))
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredImmersiveViewingMode = .portal
                  videoEntity.components.set(videoPlayerComponent)
                  videoEntity.scale *= 0.4
                  content.add(videoEntity)
              }
          }
      }
    • 13:57 - Progressive Immersion Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct ProgressiveVideoView: View {
          var body: some View {
              RealityView { content in
                  guard let url = URL(string: "https://cdn.example.com/My180.m3u8") else { return }
                  let player = AVPlayer(playerItem: AVPlayerItem(url: url))
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredImmersiveViewingMode = .progressive
                  videoEntity.components.set(videoPlayerComponent)
                  content.add(videoEntity)
              }
          }
      }
    • 14:20 - ProgressiveVideoView

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      @main
      struct ImmersiveVideoApp: App {
          var body: some Scene {
              ImmersiveSpace {
                  ProgressiveVideoView()
              }
      				.immersionStyle(selection: .constant(.progressive(0.1...1, initialAmount: 1.0)), in: .progressive)    
          }
      }
    • 17:22 - SpatialVideoMode

      if let vpc = components.get[VideoPlayerComponent.self] {
      	vpc.desiredSpatialVideoMode = .spatial
      }
    • 18:32 - Spatial Video Portal Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalSpatialVideoView: View {
          var body: some View {
              RealityView { content in
                  let url = Bundle.main.url(forResource: "MySpatialVideo", withExtension: "mov")!
                  let player = AVPlayer(url: url)
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredViewingMode = .stereo
                  videoPlayerComponent.desiredSpatialVideoMode = .spatial
                  videoPlayerComponent.desiredImmersiveViewingMode = .portal
                  videoEntity.components.set(videoPlayerComponent)
                  videoEntity.scale *= 0.4
                  content.add(videoEntity)
              }
          }
      }
    • 19:02 - Spatial Video Immersive Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalSpatialVideoView: View {
          var body: some View {
              RealityView { content in
                  let url = Bundle.main.url(forResource: "MySpatialVideo", withExtension: "mov")!
                  let player = AVPlayer(url: url)
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredViewingMode = .stereo
                  videoPlayerComponent.desiredSpatialVideoMode = .spatial
                  videoPlayerComponent.desiredImmersiveViewingMode = .full
                  videoEntity.position = [0, 1.5, -1]
                  videoEntity.components.set(videoPlayerComponent)
                  content.add(videoEntity)
              }
          }
      }
    • 19:46 - ImmersiveSpatialVideoView

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      @main
      struct SpatialVideoApp: App {
          var body: some Scene {
              ImmersiveSpace {
                  ContentSimpleView()
              }
              .immersionStyle(selection: .constant(.mixed), in: .mixed)
              .immersiveEnvironmentBehavior(.coexist)
          }
      }
    • 21:40 - Comfort Mitigation Event

      switch event.comfortMitigation {
      case .reduceImmersion:
          // Default behavior
          break
      case .play:
          // No action
          break
      case .pause:
          // Show custom pause dialog
          break
      }

Developer Footer

  • ビデオ
  • WWDC25
  • visionOSアプリでのイマーシブなビデオ再生のサポート
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習とAI
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン