概要
Unityで360度動画を再生するとき、4Kの解像度を境界として、動画コンテナに工夫が必要でした。
360度動画をUnity上で再生するための操作は、公式ドキュメントに手順が掲載されていますが、Unityにインポートするまでの工夫や、そうせざるを得ない背景事情を取り扱います。
2023年追記:
VR180フォーマットでも再生できたので、手順を追加。Apple Visionで取り上げられていたので、VR180の方が主流になる予感。
Vive Pro Eye程度だとそこまで解像感が良くないのですが、最近のHMDだと8Kぐらいの解像度は必要だと実感してます。HMDで片目4Kのパネルが主流になれば、12Kぐらい欲しくなる予感。H.266/VVCに期待。
2024年追記:
表「元ファイルの動画」の表記ミスを修正。180/360度動画と2D/3Dを混同を修正。
動画形式など、記事作成当時の誤った知識に基づく情報を修正。
表現の修正。
環境
ソフトウェア
- Windows 10
- Unity 2019.4.x, 2022.3.34
- SteamVR
- HTC Vive, Vive Pro Eye
ハードウェア 1 (2020年時点)
- Intel Core i7 10700
- NVIDIA RTX 2070 Super
- DDR4 32GB
ハードウェア 2 (2023年追記)
- AMD Ryzen 9 7950X
- NVIDIA RTX 3090
- DDR5 64GB
カメラ
- Insta360 Pro 2 (360度カメラ)
- EOS R5C + RF 5.2mm F2.8 (2023年追記, VR180対応)
背景
一般的にUnityに動画をインポートする際には、H.264 (typically in a .mp4, .m4v, or .mov format)を選択するが一般的です。H.264は4K解像度までの対応が標準で、それを超える解像度はH.265を使用する必要があります。
一方で、H.264でもソフト(EOS VR Utilityなど)によっては、8K解像度で書き出せることもあり、VLCやMPCで再生できてしまいます。ですが、Unityでは正しく再生されません。本来、8KはH.264で想定されてないはずなので、H.265の動画を作成した方が望ましいです。
H.264の次世代規格であるH.265は、8K解像度を標準で扱えます。UnityでもUnity 2019.1からH.265をサポートしています。
Unityにインポートするまで
- H.265形式の動画ファイルを作成
- HEVC ビデオ拡張機能の導入(120円)
- Unityにインポート
1. H.265形式の動画ファイルを作成
お好みのエンコーダーや編集ソフト、各種ツールより、動画をH.265形式でエンコードして書き出します。H.265形式でのCPUエンコードは時間がかかるため、Intel QSVやNVIDIA NVENCやAMD VCEのような、GPUを活用したハードウェアエンコードあるいは、GPU支援を活用することで、高速化できます。
エンコードについては、私はいつもこちらの方のブログを参考にしています。
元ファイルの動画(Insta360 Pro 2撮って出しを付属ソフトでスティッチした直後の状態)
解像度・フレームレート | フォーマット | 2D, 3D | プロファイル | Chroma Subsampling | Bit depth | ビットレート(参考程度) |
---|---|---|---|---|---|---|
8K30p(7680x3840, 29.97fps) | 360度 | 単眼視 | Main@L6.1@High | 4:2:0 | 8bit | 約150Mbps |
8K30p(7680x7680, 29.97fps) | 360度 | 両眼立体視 | Main@L6.2@High | 4:2:0 | 8bit | 約300Mbps |
元ファイルの動画(EOS R5C + RF 5.2mm F2.8の撮って出しをEOS VR Utilityで書き出した状態)
解像度・フレームレート | フォーマット | 2D, 3D | プロファイル | Chroma Subsampling | Bit depth | ビットレート(参考程度) |
---|---|---|---|---|---|---|
8K30p(8192x4096, 29.97fps) | VR180 | 両眼立体視 | L6.1@High | 4:2:2 | 10bit | 約200Mbps |
8K30p(8192x4096, 29.97fps) | VR180 | 両眼立体視 | L6.1@High | 4:4:4 | 10bit | 約800Mbps |
動画ファイルの軽量化
上記の表について、Chroma Subsamplingが4:2:2や4:2:2、Bit depthが10bitで作成されている動画は、Microsoft Media FoundationやDXVAでのデコード処理に問題があるのか、一般的な動画再生ソフトや、後の行程でのUnityで、正しく再生できないことがあります。
この4:2:2や10bitは、プロダクションや編集のための、より高度なフォーマットです。これは、カメラでの撮影時に最大限データを確保し、編集耐性を持たせるために使用されるものです。
そのため、FFpmegやXMedia Recodeなどでエンコード、あるいは編集ソフトで編集や調整を終わらせ、再生に適したファイルへの書き出しを行います。VR180動画の場合、解像度やフレームレートはそのままに、Main@L6.1とし、QP18前後の設定で、4:2:0、8bitで書き出せば、Unity環境において、HMDで視聴しても正しく再生できるファイルとなります。
※ 8K動画はLevel 6以上推奨です。
2. HEVC ビデオ拡張機能の導入
現在、VR開発はWindowsの環境下で行われることが大半だと思われます。
Unityは、Unity 2019.1からH.265をサポートしましたが、Windows上で動くUnity
では、動画のインポートと再生にHEVC ビデオ拡張機能を導入する必要があります。
これは、UnityがMicrosoft Media Foundationを利用しているためです。
この拡張機能は実質有償化しましたが、OSレベルでH.265デコード機能が扱えるようになり、UnityでH.265が扱えるほか、エクスプローラのサムネイルでの表示やプレビューに対応します。
3. Unityにインポート
公式ドキュメントに手順が掲載されています。2Dと3Dの双方の手順が記載されています。
2023年追記:以下の手順に示すスクリーンショットで、大体の流れを確認してみてください。
手順0
VR関係の導入。省略。
このプロジェクトは古いので、CameraRigを導入済みですが、最近であれば、XR Interaction ToolkitによるXROriginなどになってます。
また、Unity 2022.3環境のURPでも動作を確認しました。
手順1
RenderTextureは動画の解像度に設定します。
初期設定ではDepthBufferが設定されているので、Unityのリファレンスに従い、No depth bufferに設定します。
手順2
SkyBoxを変更するためのMaterialを作成します。
ShaderをSkybox/Panoramicとし、ImageTypeを動画の種類に合わせて設定します(180/360)。
3D Layoutは両眼立体視動画で必要で、動画に合わせて、上下配置(Over Under)と左右配置(Side by Side)の設定を行います。2Dの場合はNoneです。
対応するRenderTextureをこのMaterialのInspectorにD&Dして、設定します。
VR180動画の場合
360度動画の場合
手順3
Window -> Rendering -> Lighting Settingsから、Skybox Materialを設定します。
手順2で作成したMaterialに変更します。
この時、CameraのClear FlagsがSkyboxになっている必要があります。
手順4
VideoPlayerを配置し、URLやインポートした動画を指定します。
手順1で作成したレンダーテクスチャを、TargetTextureに指定します。
動画によってAspect Ratioを変更してください。
再生
これで大丈夫なはずです。動画やHMDの回転情報により、HMDの視野角外(正面でない)で再生される場合があります。その際は、空の親オブジェクトで調整するなどを行ってくださ。