ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
魅力的な空間写真と空間ビデオの作成
空間写真と空間ビデオをアプリに取り入れる方法について説明します。さまざまなタイプのステレオスコピック(立体)メディアを紹介し、iPhone 15 Pro上のiOSアプリに空間ビデオを取り入れる方法を解説します。visionOSの新しいQuickLook Preview Application APIなど、空間メディアを検知して表示するためのさまざまな方法を確認しましょう。写真やビデオを空間対応にするメタデータとステレオの概念についても詳しく説明します。
関連する章
- 0:00 - Introduction
- 1:07 - Types of stereoscopic experiences
- 4:13 - Tour of the new APIs
- 13:14 - Deep dive into spatial media formats
リソース
- AVCam
- Converting side-by-side 3D video to multiview HEVC and spatial video
- Creating spatial photos and videos with spatial metadata
- Forum: Spatial Computing
- Writing spatial photos
関連ビデオ
WWDC24
WWDC23
-
ダウンロード
こんにちは Vedantです Apple Vision Proのエンジニアです このセッションでは 空間写真と空間ビデオを使用して 魅力的な体験を 構築する方法を紹介します 空間写真と空間ビデオを 発表してから1年が経ちました かつてない ビジュアルストーリーの 世界を開く新メディアを利用して 人々が家族との大切な瞬間を再体験したり 世界中のストーリーを共有したり 水中や空中での体験など 驚くような世界が実現しています
そして今 機械学習を使って どんな写真でも 空間写真に変換できるようになり 過去の思い出を新しい方法で 再体験できるようになっています
今日は 皆さんのアプリに空間メディア体験を 追加する方法を説明します まずは 様々なステレオスコピック(3次元) ビデオ体験を確認し 空間が魅力的な理由を理解します 次に 新しい空間メディアAPIと それによって実現できる機能を見ていきます 最後に カスタム空間メディアの作成を 目指すパワーユーザーのために 空間メディアのフォーマットについて 詳しく掘り下げます まずは 様々なステレオビデオを 見ていきましょう 3次元映像はVision Proのビデオを 強化する素晴らしい方法であり Appleではそれをサポートする フォーマットを用意しています まずは3Dビデオです これは AppleTVやDisney+アプリで 利用できる3D映画のようなものです フラットな画面でレンダリングされますが コンテンツがステレオスコピックであるため 奥行きがあり ビデオ内の動きが 画面から飛び出すように見えたり 奥に引っ込んだりします
次に Vision Proや iPhone 15 Proで撮影できる空間ビデオです これは かすかに光るエッジと カスタム再生コントロールを備えた ウインドウを通してレンダリングされます これにより奥行きが強調され 不快感につながる一般的な原因が 緩和されます 空間ビデオは ポイントアンドシュート形式として優れており iPhoneのようなデバイスで 心地よく魅力的なコンテンツを撮影できます 3D映画制作のルールに 詳しくなくても大丈夫です ハイエンドのプロフェッショナルコンテンツには Apple Immersive Videoがあります 180度の8K解像度で撮影され 空間オーディオを備えています visionOS 2.0では これにプレビュー表示が追加され 空間ビデオのように 小さなフローティング ウインドウにコンテンツがレンダリングされます これにより ビデオをステレオで視聴しながら 他のアプリを操作することができます
これらの体験は このように素晴らしいものですが 本当に輝くのは フルイマーシブ体験です 他のアプリがバックグラウンドに移り コンテンツがフォーカスされます 各体験にはフルイマーシブ状態での 表示方法があります 3Dビデオは環境に溶け込み 画面が後ろに移動して拡大されます これが映画を観る私のお気に入りの方法です 2Dと3Dの両方で視聴できます
アプリにドッキングを追加する方法については 「Enhance video playback and immersion in your custom app environment」をご覧ください
空間ビデオはイマーシブな プレゼンテーションに拡張され コンテンツはオブジェクトの実際の サイズに合わせて拡大されます フレームのエッジが消え コンテンツが現実世界にスムーズに溶け込むので 見ているというよりも あたかも コンテンツの中にいるように感じられます
右上のイマーシブボタンをタップすると 空間ビデオでのフルイマーシブ体験が できます
下部の終了ボタンを押すと 縮小します
これにより 他のアプリと共有スペースで マルチタスクできる ウインドウ表示に戻ることができます
Apple Immersive Videoでは ビデオがネイティブ体験に拡大され ビデオ画面がユーザーの視界を包み込み パススルーが完全に無効化されて 中に入っていく感覚が得られます これにより プロレベルの創造的な ストーリーテリングの新しい可能性が広がり 最高の忠実度で ユーザーに ストーリーの臨場感を提供できます
3Dビデオ、空間ビデオ、 Apple Immersive Videoは それぞれ異なるコンテキストに適した 豊かなステレオスコピックコンテンツの エコシステムを形成しています そして これらはvisionOSで提供できる ステレオメディア体験のほんの一部です 空間写真もあります これも空間ビデオと同じポータルや イマーシブプレゼンテーションを使用しています カスタムビデオ体験は様々なAPIと AVFoundation RealityKitで構築できます 写真やビデオがステレオスコピックで 強化されるのと同じように リアルタイムの3Dコンテンツも ステレオで見栄えが良くなります 特にコンテンツがインタラクティブな場合 効果は顕著です 詳しくは「Bring your iOS or iPadOS game to visionOS」のビデオをご覧ください
空間メディアについて学んだところで それらをアプリに追加する方法を確認します このセクションでは 3つの新しいAPI領域について学びます 空間ビデオの録画や ファイルが 空間対応かどうかの検出と読み込み visionOSでの表示方法の 様々なオプションを取り上げます このセクションでは 空間メディアのための 新フレームワークはないことに気づくでしょう それは 皆さんがすでに愛用している Appleフレームワークに統合されているからです AVFoundation、PhotoKit、 QuickLook、WebKitなどです わずか数行のコードで 他のタイプのメディアと同じ方法で 空間メディアをアプリに追加できます まず 空間ビデオがどのように 録画されるかを見ていきましょう
iPhone 15 Proでは 広角カメラと超広角カメラを 対角ではなく 並べて配置する変更を行いました これにより iPhoneを横向きに持ったとき 2つのカメラが 同じ水平基線上に配置され 人間の目と同じように機能します これによってカメラアプリで 空間ビデオが可能になります 現在 そのAPIを公開しているので どのアプリでも空間ビデオを録画できます 仕組みを見てみましょう 通常の2Dビデオを録画するコードを書き それを空間用に拡張します
AVCaptureを使って 次のデータフローを使用します まず必要なのは CaptureDeviceからの 入力を表すdeviceInputです 例えばカメラなどです 次に 出力を管理し ディスクに書き込む MovieFileOutputが必要です 入力と出力が AVCapture Connectionで接続され AVCaptureSessionがこれらの コンポーネント間のデータフローを調整します
コードで書き出してみましょう まず AVCaptureSessionを作成します 次に AVCaptureDeviceを作成し ここではデフォルトの systemPreferredCameraに設定します
次に セッションに入力を追加します
出力もセッションに追加します
設定を確定し 実行を開始します カメラキャプチャのAPIを 以前に使ったことがある場合 このフローは非常に 見覚えがあるはずです まだお使いでなければ developer.apple.comにある AVCamサンプルコードプロジェクトをご確認ください
次に このコードを拡張して 空間ビデオを録画します 必要なことは3つだけです AVCaptureDeviceを変更し サポートされているビデオ形式を選び 出力で空間ビデオ録画を有効にします まず AVCaptureDeviceを変更します 広角カメラと超広角カメラの builtInDualWideCameraを使用します 空間ビデオは これらのカメラが 同時にストリーミングされる 必要があります
次に 空間ビデオをサポートする ビデオ形式を選びます ビデオデバイスの フォーマットを繰り返し処理し isSpatialVideoCaptureSupportedが trueであることを確認します それをビデオデバイスの activeFormatに設定します ビデオデバイスが適切にロックおよび アンロックされるようにしましょう そして エラー処理を追加します 条件を満たす空間フォーマットが 見つからない場合は falseを返します
最後に 空間ビデオキャプチャがサポート されていることを確認し されていれば isSpatialVideoCaptureEnabledを trueに設定します これはiPhone 15 Proでのみ動作します isSpatialVideoCaptureSupportedは 他のデバイスではfalseを返します その場合 適切にエラー処理を 行う必要があります
これで完了です わずか3つの小さな変更で 空間ビデオの録画が可能になります 同期 カメラ補正 エンコーディング メタデータの書き込みの複雑さは すべて抽象化されています movieFileOutputから自身のディスク上に 完全な空間ビデオファイルが得られます そして 非常に簡単ですが さらに高品質の録画を行うために 2つのことを追加できます ビデオの安定化の改善と 優れたプレビューです さっそく見ていきましょう
安定した最高の品質を実現するには preferredVideoStabilizationModeを cinematicExtendedEnhancedに設定します より長いルックアヘッドウインドウを使用し フレームの一部をトリミングして よりスムーズなビデオを実現します ビデオのスムーズさは常に重要ですが visionOSでは特に重要です 画面サイズを他のデバイスより はるかに大きくできるからです
AVCaptureVideoPreviewLayer APIを 使用してビデオプレビューを取得できます 他のビデオ形式で行う方法と 同じものです ただし iPhoneのディスプレイは単眼なので 空間プレビューは提供できません そのため デバイスの向きにかかわらず 常に広角カメラが表示されます
重要な点は 空間ビデオに使われる2つのカメラ 広角と超広角は実際には 異なる種類のカメラだということです iPhoneの広角カメラは 一般的な写真撮影に最適で 超広角カメラは ドラマチックな広角ショットや クローズアップ撮影に最適化されています 2つのカメラはそれぞれ異なる 光の収集能力と 最小焦点距離を持っています 空間撮影では ほとんどの場合 これらの違いは目立ちません これは 補正に使用される 計算写真技術のおかげです しかし 明るさの足りない低照度で 空間ビデオを撮影すると 各カメラのノイズレベルが 同じにならず Vision Proで見ると 不快に感じる場合があります 同様に 被写体をカメラの最小焦点距離より 近くで撮影すると 焦点の不一致が生じて 不快感の原因になることがあります iPhoneのプレビューは単眼鏡なので ビデオを後でVision Proで視聴したときに 問題が発覚することがあります そしてその時には 撮影しようとしていた瞬間は過ぎ去っており 再撮影はできません この問題に対処するため AVCaptureDeviceで新しい変数 spatialCaptureDiscomfortReasonsを 作成しました Key Value Observationを使って アプリ内でこれを監視し .subjectTooCloseまたは .notEnoughLight条件が検出されたときに 適切なガイダンスUIを 表示することができます
こちらはiPhoneカメラアプリです 被写体に近づきすぎると警告が表示され 遠ざかると警告が消えます あなたのアプリでも同様のガイダンスUIを 表示することをお勧めします 空間ビデオを録画しましたので 次は再生方法を見ていきます 最初のステップは アセットが空間的で あることを検出し それを読み込むことです PhotosPicker、PhotoKit、 AVAssetPlaybackAssistantなど いくつかの方法があります
PhotosPicker APIはビューを表示し ユーザーがフォトライブラリから アセットを選ぶサポートをします 空間アセットのフィルタリングも サポートされました matchingパラメータに .spatialMediaを指定すると ユーザーのライブラリをフィルタリングし 空間写真とビデオだけを表示します
ユーザー入力が必要ない場合は PhotoKitを使用して ユーザーのフォトライブラリから プログラムで すべての空間アセットを取得できます 取得するプレディケートを構築する際に PHAssetMediaSubtypeとして spatialMediaを設定するだけです
取得リクエストを修正して 空間写真のみを返すこともできます または 空間ビデオのみを 返すようにも設定できます
AVAssetPlaybackAssistantも ビデオの場合使用できます このplaybackConfigurationOptionsを 照会して ローカルアセットが空間アセットかを 確認できます これは アプリが フォトライブラリの外部から ビデオを読み込む場合に 最適なオプションです
空間コンテンツを読み込むことができたので 次は表示します ここでも いくつかの オプションがあります
QuickLookフレームワークの PreviewApplication APIは 写真とビデオをサポートします JavaScriptのElement FullScreen APIは Webから空間写真を 読み込むことをサポートします そしてAVKitのAVPlayerViewControllerは 空間ビデオをサポートします
QuickLookは visionOSでファイルを 迅速に開くためのシステム標準の方法です 新しいPreviewApplication APIを 使用すると 自分のアプリ内から QuickLookシーンを生成して 自分のコンテンツを表示できます この機能は空間写真と ビデオの両方をサポートし Photosアプリと同じ フル空間プレゼンテーションを使用します PreviewApplication API の詳細は 「What's new in Quick Look for spatial computing」をご覧ください
次に JavaScriptの Element FullScreen APIがあります これを使うと SafariでWebページから 空間写真を開くことができます PreviewApplicationと同様に これは新しいシーンで開かれ フル空間プレゼンテーションが 提供されます FullScreen APIについて詳しくは 「Optimize for the Spatial Web」を ご覧ください 最後はAVPlayerViewControllerです あらゆる種類のビデオコンテンツを再生する クロスプラットフォームAPIです 2Dおよび3Dビデオの 両方をサポートし 一貫したスタイルで 両方のコンテンツを表示する上で最適です また 空間ビデオの HTTP Live Streamingもサポートします
AVPlayerViewControllerで 空間ビデオを使用する際に いくつか注意すべき点があります ビデオはフルスクリーンになった ときにのみ3Dで表示されます インラインプレゼンテーションでは 2Dで表示されます フルスクリーンコンテンツにする最も簡単な方法 は AVPlayerViewControllerのサイズを WindowSceneのフレームに合わせることです フルスクリーンでも AVPlayerViewControllerは 3Dビデオプレゼンテーションを使用し 空間プレゼンテーションは使用しません 空間ビデオはMVHEVC上に 構築されているため 3Dビデオとしても有効であり AVPlayerViewControllerは それを3Dビデオとして扱います アプリがフル空間プレゼンテーションを 必要とする場合は PreviewApplicationを 使用してください 最後に アプリをデザインする際は ビデオの上に直接配置するUIの数を 最小限に抑えてください すっきりとしたUIは コンテンツに焦点を当て 奥行きが競合するリスクを 最小限に抑えてくれます ここまで 空間メディアを録画 検出 読み込み 表示する 複数の方法を見てきました アプリデベロッパの皆さんにとって ご紹介したAPIは アプリで空間メディアを使用するのに 必要なものです しかし カスタム空間メディアを 作成したい方のために 内側も詳しく見てみましょう
ファイル形式のレベルでは 空間ビデオはステレオMV-HEVCビデオで 追加の空間メタデータがあります
空間写真はステレオHEICで ステレオグループに2つの画像と いくつかの空間メタデータが含まれています これらのファイルを読み書きする方法については developer.apple.comで 2つのサンプル コードプロジェクトと記事をご確認ください 次に 空間メタデータの詳細を見てみましょう これらは両方のファイル形式に共通しています 空間メタデータは いくつかの要素で構成されています まず投影があります これは 世界のオブジェクトと 画像内のピクセルとの関係を定義します 空間写真とビデオでは常に 直線投影が使用されます 次に ベースラインと 視野角があります これらは 空間アセットを撮影する カメラの物理的特性を説明するものです そして視差調整があります これは ウインドウ表示での 3D効果をコントロールするものです さらに 左画像と右画像の 作成方法に関するガイドラインがあります これらは画像の特性であり ピクセルとして画像に保存されますが 明示的な メタデータフィールドではなく ファイルが空間ファイルかどうかを 確認するときに強制されません しかし 最適な視聴体験のためには 理解して 正しく設定することが重要になります
最適な画像特性のために 左画像と右画像は ステレオ補正されている必要があり 光軸が揃っており 垂直のズレがないことが求められます 多くの新しい技術用語が出てきました よりよく理解するため 例を挙げていきましょう
このハチドリを 空間写真撮影のモデルにしましょう 撮影にあたり ステレオペアの2台のカメラを 水平にアラインさせました
それぞれのカメラが同期して撮影し ステレオペアの左画像と 右画像を形成します これらはピンホールカメラなので 画像は直線投影されています つまり 世界の直線は 画像でも直線として表示されます
最初のメタデータフィールドは ベースラインで 視軸距離とも呼ばれます 2台のカメラの中心間の 水平距離を定義するものです ベースラインを設定する最適な距離は ユースケースに依存します 約64mmの値は 私達の目の間隔に近いため 最も人間の視覚に 近い画像を生成します ただし 特に近接シーンを撮影する時は より小さい値も効果的です 遠くのオブジェクトの奥行きを捉えるには 非常に大きなベースラインが使用されます 例えばステレオ風景写真撮影で 使用できます 広いベースラインのトレードオフは 誇張された奥行きによる 小型化効果です この例では 64mmのベースラインを使用します
次のメタデータは視野角で 各カメラがキャプチャする 水平角度を度で示します 一般的に 視野角が広いほど より臨場感があり シーンの多くが見えるようになります ただし 固定センサーでは 視野角が広いと 同じピクセル数に より多くのコンテンツが広がるため 角度分解能が低くなります さらに 直線投影を使用しているため 90度以上の視野角は 角度サンプリング密度が効率的でなく 特にエッジ部分では推奨されません この例では 視野角を 60度に設定します
では すべての画像特性を 確認してみましょう 最初のガイドラインは 画像が ステレオ補正されている必要があることです つまり こちらのように 2つのカメラの光軸が 平行であることを意味します そして 2つの画像が 同じ平面上にあることです カメラの光軸が平行でない場合 こちらのように 画像は同一平面上にないため ステレオ補正されません その場合 画像処理技術である ステレオ補正を使用して 画像の歪みを補正する必要があります
次に 画像の中心が光学的中心と アラインしていることを確認しましょう これは 各画像の中心ピクセルが光軸と アラインしていることを意味します これはピンホールカメラの場合 デフォルトになりますが このアラインメントがわずかなことで 偶然に崩れてしまう場合があります 画像で詳しく見てみましょう
こちらがステレオ画像ペアです イメージセンサーがあり 画像の中心が光軸とアラインしています しかし 画像を切り取ると 中心ピクセルが変わります 新しい中心ピクセルは 光軸とアラインしていないため この切り取られたステレオペアは 最適とはいえません 同様に 画像を左右にシフトした場合も 中心ピクセルが変わってしまい このガイドラインに反することになります この種の水平シフトを適用することは 3D映画制作では一般的な手法で 芸術的な効果を実現するためのもので 空間メディアには推奨されません その効果を達成するために 視差調整メタデータがあります これについては後で説明します まず 垂直のズレがないことを 確認しましょう 最も簡単な方法は 左画像と右画像を取り 両方の画像に共通する 特徴点を見つけることです ここでは鳥のくちばしです そして それらを線で結びます その線が完全に水平であれば 画像は正しくアラインしており 垂直のズレはありません
ここに カメラにズレが発生した 別のステレオペアがあります
特徴点をマークし それらを結ぶことで 垂直のズレを確認できます ここでは 特徴点間の線が 完全に水平ではありません つまり画像に垂直のズレがあり Vision Proで見ると 不快感が生じます
ここまでの内容を振り返りましょう 左フレームと右フレームをチェックして これらが直線投影されていることを確認し ステレオ補正され 光軸がアラインされ 垂直のズレがないことを確認しました また ベースラインと 視野角も把握しました
次に コンテンツがどうレンダリングされるか 見てみましょう ここが魔法が生まれるところです 慎重なカメラ補正の すべてが最終的に実を結びます 提供された情報をもとに レンダラーはカメラモデルを構築し カメラがどのように世界のオブジェクトを キャプチャしたかを定義します
それらの光線を逆にたどり 正しいサイズと距離で 2つの画像をレンダリングします
Vision Proで見ると それぞれの目に1つの画像が表示されます 視覚システムはその2つの画像を融合して 3Dシーンを形成し 3Dオブジェクトとして認識します ファイルを正しく構築し 正確なメタデータを用意し すべての画像特性ガイドラインに 従っていれば 目に見える画像と カメラに写る実際のオブジェクトが 完全に一致します ユーザーは現実のことのように その瞬間にテレポートし カメラを自分の目に置き換えます これが「その瞬間を再体験する」 魔法のような感覚をもたらすのです
空間写真は 共有スペースでも同様にパワフルです このモードでは visionOSがこれらの画像を ウインドウで表示し シーンを縮小しながら 立体的にレンダリングします ここでの目標は 完全に現実的にすることではなく むしろ芸術的かつ感情的に 共鳴する3D効果をもたらすことです ユーザーがウインドウ内のコンテンツを 快適に視聴できるようにするため 最後の空間メタデータ 「視差調整」を組み込みます ステレオ写真に習熟している方にとっては 視差調整はレンダラーに対する ヒントになり ゼロ視差平面を どこに配置するかを示すものです これは収束調整と呼ばれることもあり 水平画像変換と 言われることもあります
実際には 画像幅の割合で表される 水平オフセットを示しています 負の値は左フレームを右に 右フレームを左に押し出します 正の値は逆の方向に押し出されます
画像が水平にシフトすると 脳が認識する 3Dシーンは奥の方向にシフトし z軸に沿って移動します したがって 負の値は コンテンツをユーザーに近づけ 正の値はコンテンツを 遠ざけることになります この値を設定する際は注意してください 負の値が大きすぎると 奥行きに矛盾が生じ 正の値が大きすぎると 目が外向きにずれてしまう可能性があります 特に背景のオブジェクトでは 不快感を引き起こすことがあります このシーンでは ハチドリが 窓の手前に見えるように値を選びます わずか数パーセントの変化でも 画像の見え方が 大きく変わる可能性があるため Vision Proでテストして 視差調整の値を適切に指定してください ではここで 水平視差調整を加えます これで 空間アセットを構築するための すべての入力がそろいました あとは このデータを適切なファイル形式に パッケージ化するだけです ビデオの場合はステレオMV-HEVC 写真の場合はステレオHEICです
完成した作品が Apple Vision Proで 正しくレンダリングされ ウインドウ表示でも フルイマーシブ表示でも 素晴らしい視聴体験をもたらします
ではまとめましょう 今回のセッションでは visionOSの様々な種類の ステレオメディアについて学びました 3Dビデオ Appleのイマーシブビデオ 空間写真と空間ビデオです そして アプリで空間写真や空間ビデオを キャプチャ 検出 表示する方法を見てきました また Vision Proでの 素晴らしい体験のため 正確なメタデータと完全にアラインした 画像を用いて それぞれの空間メディアを 作成する方法を確認しました
以上となります 皆さんが空間メディアを使って作る 新しく素晴らしい体験を楽しみにしています
-
-
6:19 - Spatial video capture on iPhone 15 Pro
class CaptureManager { var session: AVCaptureSession! var input: AVCaptureDeviceInput! var output: AVCaptureMovieFileOutput! func setupSession() throws -> Bool { session = AVCaptureSession() session.beginConfiguration() guard let videoDevice = AVCaptureDevice.default( .builtInDualWideCamera, for: .video, position: .back ) else { return false } var foundSpatialFormat = false for format in videoDevice.formats { if format.isSpatialVideoCaptureSupported { try videoDevice.lockForConfiguration() videoDevice.activeFormat = format videoDevice.unlockForConfiguration() foundSpatialFormat = true break } } guard foundSpatialFormat else { return false } let videoDeviceInput = try AVCaptureDeviceInput(device: videoDevice) guard session.canAddInput(videoDeviceInput) else { return false } session.addInput(videoDeviceInput) input = videoDeviceInput let movieFileOutput = AVCaptureMovieFileOutput() guard session.canAddOutput(movieFileOutput) else { return false } session.addOutput(movieFileOutput) output = movieFileOutput guard let connection = output.connection(with: .video) else { return false } guard connection.isVideoStabilizationSupported else { return false } connection.preferredVideoStabilizationMode = .cinematicExtendedEnhanced guard movieFileOutput.isSpatialVideoCaptureSupported else { return false } movieFileOutput.isSpatialVideoCaptureEnabled = true session.commitConfiguration() session.startRunning() return true } }
-
9:13 - Observing spatial capture discomfort reasons
let observation = videoDevice.observe(\.spatialCaptureDiscomfortReasons) { (device, change) in guard let newValue = change.newValue else { return } if newValue.contains(.subjectTooClose) { // Guide user to move back } if newValue.contains(.notEnoughLight) { // Guide user to find a brighter environment } }
-
9:58 - PhotosPicker
import SwiftUI import PhotosUI struct PickerView: View { @State var selectedItem: PhotosPickerItem? var body: some View { PhotosPicker(selection: $selectedItem, matching: .spatialMedia) { Text("Choose a spatial photo or video") } } }
-
10:14 - PhotoKit - all spatial assets
import Photos func fetchSpatialAssets() { let fetchOptions = PHFetchOptions() fetchOptions.predicate = NSPredicate( format: "(mediaSubtypes & %d) != 0", argumentArray: [PHAssetMediaSubtype.spatialMedia.rawValue] ) fetchResult = PHAsset.fetchAssets(with: fetchOptions) }
-
10:36 - AVAssetPlaybackAssistant
import AVFoundation extension AVURLAsset { func isSpatialVideo() async -> Bool { let assistant = AVAssetPlaybackAssistant(asset: self) let options = await assistant.playbackConfigurationOptions return options.contains(.spatialVideo) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。