概要
Unityで360度動画を再生するとき,4Kの解像度を境界に動画コンテナに工夫が必要でした。
360度動画をUnity上で再生するための操作は,公式ドキュメントに手順が掲載されていますが,Unityにインポートするまでの工夫や,そうならざるを得ない背景事情を取り扱います。
2023年追記:
VR180フォーマットでも再生できたので,手順を追加。Apple Visionで取り上げられていたので,VR180の方が主流になる予感。
Vive Pro Eye程度だとそこまで解像感が良くないのですが,最近のHMDだと8Kぐらいの解像度は必要だと実感してます。HMDで片目4Kのパネルが主流になれば,12Kぐらい欲しくなる予感。H.266/VVCに期待。
環境
ソフトウェア
- Windows 10
- Unity 2019.4.x
- 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
- EOS R5C + RF 5.2mm F2.8 (2023年追記)
背景
一般的にUnityに動画をインポートする際には,H.264 (typically in a .mp4, .m4v, or .mov format)を選択するが一般的です。
しかし,H.264形式は4K30p(4,096×2,048)までが標準仕様で,それを超える解像度(例. H.264形式の8K動画)をUnityで扱う際には,iGPU(CPU内蔵グラフィックス)やdGPU(グラフィックボード)のデコード支援が利用できませんでした。
その結果,デコード処理がCPUで行われるため,動画の再生がカクカクになります。
H.264の次世代規格であるH.265は,8K120p(8192×4320)まで標準仕様です。UnityでもUnity 2019.1からH.265をサポートしています。
Unityにインポートするまでの準備
- H.265形式で動画をエンコード
- HEVC ビデオ拡張機能の導入(120円)
1. H.265形式で動画をエンコード
お好みのエンコーダーで,動画をH.265形式でエンコードします。筆者の環境では以下の設定で運用しています。H.265形式のCPUエンコードは非常に時間がかかるため,Intel QSVやNVIDIA NVENCやAMD VCEによるハードウェアエンコードをおすすめします。
エンコードについては,私はいつもこちらの方のブログを参考にしています。
元ファイルの動画(カメラ撮って出しを付属ソフトでスティッチした直後の状態)
形式 | 2D, 3D | プロファイル | Chroma Subsampling | Bit depth | 生成動画のビットレート(参考程度) |
---|---|---|---|---|---|
8K30p(7680x3840) | 2D, 単眼視 | Main@L6.1@High | 4:2:0 | 8bit | 約150Mbps |
8K30p(7680x7680) | 3D, 両眼立体視 | Main@L6.2@High | 4:2:0 | 8bit | 約300Mbps |
8K30p(8192x4096) | 2D, 両眼立体視 | Main@L6.1@High | 4:2:2 | 10bit | 約200Mbps |
XMedia Recodeでエンコードして軽量化
上記の表の動画だと,Microsoft Media Foundationが対応していないことがあり,再生できないことがあります。特に4:2:2や10bitの部分で引っ掛かっている印象。
そのため,一度エンコードして軽量化させた方が良いです。VR180動画の場合,解像度やフレームレートはそのままに,Main@L6.1とし,QP18前後の設定で,4:2:0, 8bitで書き出せば,再生できるファイルが出来上がります。
※ 8K動画はLevel 6以上推奨です。
2. HEVC ビデオ拡張機能の導入
現在VRヘッドマウントディスプレイを扱うには,Windows一択のため,Windowsで動かしている方が大半だと思います。
Unityは,Unity 2019.1からH.265をサポートしましたが,Windows上でのUnity
では,動画のインポートと再生にHEVC ビデオ拡張機能を導入する必要があります。
これは,UnityがMicrosoft Media Foundationを利用しているためです。
この拡張機能は実質有償化しましたが,OSレベルでH.265デコード機能が扱えるようになり,UnityでH.265が扱えるほか,エクスプローラのサムネイルでの表示やプレビューに対応するようになります。120円です。将来的にOS標準サポートになるといいですね。
こぼれ話:カメラRAWやAV1の拡張機能は無償提供されています。
Unityにインポートしてからの手順
公式ドキュメントに手順が掲載されています。2Dも3Dもどんとこい。
追記:以下の手順に示すスクリーンショットで,大体の流れを確認してみてください。
手順0
VR関係の導入。省略。
このプロジェクトは古いので,CameraRigを導入済みですが,最近であればXROriginなどになってます。
手順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を変更してください。
再生
これで大丈夫なはずです。