UnityでOculus Rift用に作成した高解像度のmp4動画がカクつくことに関する検証
UnityでOculus Rift用に動画コンテンツを作る際に、解像度によっては結構な頻度でカクつきが発生します。
原因や解決方法など色々調べたので備忘録もかねて書いておきたいと思います
Movie Texture
UnityにはWindowsプラットフォーム用にMovie Textureという機能が存在します。
これを使えば簡単に動画を再生できるのですが、動画によってはスムーズに再生されなかったり、そもそも再生されなかったりします
問題の動画
- 解像度:4K
- Frame rate: 25FPS
- 動画サイズ: 350MB
- 動画時間:120秒
そもそも再生できない問題
ファイルサイズ
350MBくらいの動画を再生しようとしたが、そもそも再生がはじまらない
編集ツールでファイルを分割して検証してみた
- 4k + 10秒(38MB): 再生可能、ただし最初の方は映像が乱れる
⇒ファイルサイズが大きいと再生がはじまらないっぽい
フレームレート
今回検証に使った動画は25FPSだが、他の30FPSの動画を再生したところ問題なく動いた
⇒フレームレートは関係ないっぽい
再生はじめが乱れる問題
解像度
- 4K(3842×1920)動画は再生はじめに映像が乱れる
- 解像度を落として検証したところ・・・
- 2K + 10秒の動画:再生可能&乱れない
- 2K + 30秒の動画:再生可能&乱れない
- 2K + 2分の動画:再生可能&乱れない
⇒解像度が高いと再生はじめが乱れるっぽい
考察
Unity DefaultのMovieTextureはファイルサイズが大きくなると再生自体が出来ない模様
さらに、ファイルサイズが小さくても1920pまでしか綺麗に再生できない模様
AVProVideo
Windows用に高解像度の360動画コンテンツを作る際に最もメジャーな(?)AssetであるAVProVideoでも検証してみた
普通に検証
再生は出来るが、すごいカクつく
Unityのログには以下のようなWarnログが表示される
[AVProVideo] Using software video decoder.......
対策
その1 起動オプションをつける
Unityをコマンドラインで実行し、"-force-d3d11-no-singlethreaded"オプションをつけると、warnログも消えて、表示もスムーズになる
ただし、このオプションはビルド時には反映されないため、ビルドしたアプリも同様にコマンドラインで実行して上記のオプションを指定しなければいけない
その2 Force DirectShow機能を使う
AVProVideoには前のversionとしてAVPro Windows MediaというAssetが存在し、そちらは既にAsset Storeでは公開終了しているものの、以下のサイトから無料パッケージがまだダウンロードできる
こちらを試してみたところ、カクツキなくスムーズに再生された
予想としては、
- AVPro Windows Mediaはcodecとして恐らくデフォルトでDirectShowを利用している
- しかし、AVProVideoは全プラットフォーム対応なので、Unityの標準であるQuickTimeを利用している
- 試しにQuickTimeで直接4kのmp4動画を再生してみたところ、Riftで見たときほどではないがカクついた
つまり、Unityが利用するcodecをDirectShowにして、適切なCodecを利用できるようにしてやれば解決する?
対策として、以下の過去ポストにしたがって、
portaltan.hatenablog.com
- 高解像度mp4動画を低コストで再生できるLAV filterをインストール
- codec tweakerでH.264再生時のデフォルトcodecをLAVに変更
- UnityのAVProVideoのpropertyで、Media Player > Platform Specific > Windows > Force DirectShowにチェックを入れる
- TimeScaleにもチェックいれておく
以上の設定を行ったところ、実行時に特別なオプションを指定しなくともスムーズに動画が再生されるようになった
注意
Force DirectShow機能は途中から導入されたようなので、古いversionだと項目自体がありません
追記
AVProVideo (Windows)だとそもそもDirectShow前提なのか項目がなかった。
替わりにHardwareDecordingの項目があって、それにチェックをいれるとスムーズに再生された。