LoginSignup
2
4

【Unity 2019.4〜】8Kの360度動画やVR180動画を実用的なパフォーマンスで再生する(HEVC使用)

Last updated at Posted at 2020-12-04

概要

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にインポートするまでの準備

  1. H.265形式で動画をエンコード
  2. 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.PNG

手順2

SkyBoxを変更するためのMaterialを作成します。
ShaderをSkybox/Panoramicとし,ImageTypeを動画の種類に合わせて設定します(180/360)。
3D Layoutは両眼立体視動画で必要で,動画に合わせて,上下配置(Over Under)と左右配置(Side by Side)の設定を行います。2Dの場合はNoneです。

対応するRenderTextureをこのMaterialのInspectorにD&Dして,設定します。

VR180動画の場合

キャプチャ3.PNG

360度動画の場合

キャプチャ4.PNG

手順3

Window -> Rendering -> Lighting Settingsから,Skybox Materialを設定します。
手順2で作成したMaterialに変更します。

この時,CameraのClear FlagsがSkyboxになっている必要があります。

手順4

VideoPlayerを配置し,URLやインポートした動画を指定します。
手順1で作成したレンダーテクスチャを,TargetTextureに指定します。
動画によってAspect Ratioを変更してください。

キャプチャ.PNG

再生

これで大丈夫なはずです。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4