Untiy:AVProでH.264やHapの4K 動画を再生して比較する

AVPro のイメージ。

Unity で 4K 以上の動画を再生しつつ、別のオブジェクトも動作させる必要も出てきたので、AvPro を使うことにしました。 標準的な MovieTexture ではパフォーマンス的には間に合わなさそうだったので。

AVPro について

AVPro は Unity で動画を再生するためのアセットです。標準的な MovieTexture では十分でない場合には利用します。 概ね、再生品質(フレーム落ちしないなど)が重要視される、FHD 以上の高い解像度が必要である、軽量である必要がある場合に利用することになると思います。

個人的には Unity の Asset に追加したときに発生する再エンコードの待機をしなくて良いのも利点です。

AVPro はフルパッケージだと少々値段が高いですが、特定のプラットフォームのみで利用することができるパッケージも用意されています。 また透かし(Watermark)が入る試用版もあるので、機能のは割には比較的利用しやすいかと思います。

自力で実装しても良いのですがコーデックなどに関するノウハウが必要ですし、コーディングする時間を考えると、AVPro の費用追効果は大きいでしょう。

背景で再生するモードなどもありますが、ここでは MovieTexture と同じように Material に張り付けて利用する方法で試験します。 試用版を導入すれば利用方法は分かりそうなのでここでは導入方法は割愛します。

Material に適用する分には「Demo_Mapping3D」シーンが参考になると思います。

H.264 と Hap で比較する

Youtube などでも利用されている、執筆時点で最も標準的な H.264 コーデックと、低負荷高速再生用の Hap コーデックで比較します。 恥ずかしながら Hap コーデックの存在は教えてもらうまで知りませんでした。

H.264 は高い圧縮率の一方、デコードに少々負荷が必要なのに対し、Hap は圧縮率はないしビットレートも高くなるものの、低負荷で高速にデコードできるコーデックです。 また Hap は GPU (アクセレーション?)にも対応するようです。

Hap 動画を用意する方法については「ffmpeg で高速低負荷な Hap コーデックの動画に変換する」のページを参照してください。

Hap は圧縮状態で GPU に送り、GPU で展開するということみたいです。

Windows 環境で AVPro を使って Hap を再生するときの注意

Mac 環境だとどうなのかよくわかりませんが、Windows 環境で Hap コーデックの動画を再生するには注意が必要なようです。 DirectShow などが必要になるようなので、ffdshow などを利用して DirectShow が使える環境を用意しましょう。

また AVPro で Hap 形式の動画を指定しても動画が上手く再生されないことがあります(読み込みには成功する)。

そのようなときは、AVPro のMedia Player をインスペクタで開き、設定項目 Platform SpecificWindows を選択します。 下部に展開されるメニューから Force DirectShow を有効にすると、再生時に DirectShow が使われるようになり、Hap の動画が再生できるようになるはずです。

上記の手順で再生されないときは、別の問題が起きている可能性があります。

実行結果

手ごろな 4K 動画素材が見当たらなかったので、過去に投稿した自分の動画を実験台にしています。 適当な方法で youtube からダウンロードして実験することができると思います。mp4/H.264 形式なので、 「ffmpeg で高速低負荷な Hap コーデックの動画に変換する」で紹介するように Hap に変換したものも用意します。

AVPro の設定は ForceDirectShow を除き初期設定のまま、WindowsOS 本体でコーデックなどの設定は変更しないままで検証します。 使用率などの監視は Open Hardware Monitor です。

とりあえず再生時の負荷だけ見れたらよかったので、Quad に張り付けて再生しました。

AVProで4K/H.264動画を再生した様子。 AVProで4K/Hap動画を再生した様子。

Hap の CPU 使用率が H.264 の半分程度です。また GPU のクロックが Hap の方が大きいことから、GPU を使って再生していることも確認できます。

H.264 の方ですが、すべてのコアを平均して 60% 以上利用されていたら動画を再生しながらオブジェクトをゴリゴリ動かすなんてできませんね。 結論としては Hap が大いに有効そうです。

H.264 の 4K 動画を扱うときの問題点

もちろんビットレートなどにもよりますが、H.264 の 4K 動画を再生したときに起こった問題についてまとめておきます。

  • CPU 使用率が常に高い。
  • フレームスキップがちょくちょく起きる(一瞬カクついて見える)。 - これについては GC が走ることで起きるようです(AVPro によれば)。
  • ループ時に特にカクツキ、モタツキが起きる。

Hap ではこれらの問題が解決しています。代わりに、ビットレートが大きくなりファイルサイズも比例して大きくなっています。 VDMX などメジャーなソフトウェアが SSD を推奨しているので、素直に SSD を使うのが良さそうです。

ただ今回の実験動画では暗転するのでループ時のカクツキが気になりにくいです。動画を工夫すれば H.264 でもシームレスにつないでるように見えるかも。 動画と同期してなにかやりたい、なんて時には問題が起きるかもしれませんし、そもそも CPU 使用率も高いのであんまり派手なことはできませんが。

また AVPro は GC に弱いっぽいので、意図的に GC 走らせるようなら注意する必要がありそうです。検証はしていませんが。

Hap のその他の詳細は「ffmpeg で高速低負荷な Hap コーデックの動画に変換する」を参照してください。

Reference