8KのVR動画をAndroidスマートフォンで再生しようとすると、映像が紙芝居のようにカクつく、再生を続けるうちに音声だけが先に進んでいく、あるいはファイルを開いても画面が真っ暗なまま、といった問題に行き当たります。
これらは「スマホの性能が足りない」という一言で片付けられがちですが、実際には原因が3つに分かれており、どこに問題があるかによって対処法がまったく違います。この記事では原因の切り分け方と、それぞれに対する具体的な手当てを説明します。
4Kと8Kの間には、数字の見た目以上の隔たりがあります。解像度は縦横それぞれ2倍なので、画素数は4倍です。7680×3840の映像は約2,950万画素あり、これを毎秒60回デコードして描画することになります。
さらにVR動画には、通常の動画にはない事情が3つ加わります。
360度動画は、映像全体を球体の内側に貼り付けて、その中心から一部分だけを見る仕組みです。視界に入っているのは全体の1割程度でも、デコードは常に8K全域に対して行われています。見えていない部分を省略することはできません。
デコードした映像はGPUのテクスチャとして扱われますが、このテクスチャには機種ごとに最大サイズの制限があります。多くのAndroid端末では8192ピクセルです。
7680×3840の映像はこの範囲に収まりますが、8192×4096の映像は上限ちょうどです。上限が4096止まりの端末では、8K映像はそもそも表示できません。
立体視のVR動画は、1つの映像の中に左目用と右目用の絵が並んで入っています。SBS(サイド・バイ・サイド、左右分割)なら横方向に、TB(トップ・アンド・ボトム、上下分割)なら縦方向に半分ずつです。
つまり8Kの立体視動画は、片目あたりでは実質4K相当ということになります。逆に言えば、片目に4Kの精細さを届けるには、元のファイルが8Kである必要があるわけです。VR動画で8Kが求められるのはこのためです。
ここが最初の分岐点です。ハードウェアデコーダーが8Kに対応していない端末では、どのプレイヤーを使っても8Kは滑らかに再生できません。
目安として、8K動画のデコードに対応しているのは、ハイエンドクラス(いわゆるフラッグシップ向け)のチップを積んだ機種です。発売年よりチップの格のほうが効くため、数世代前の上位機種でも再生できる一方、最新のミドルレンジ機では対応していない、ということが普通に起こります。
正確に知りたい場合は、端末のコーデック情報を表示するアプリ(「Codec Info」などの名称でPlayストアに複数あります)を使うと、対応している映像形式とその最大解像度を確認できます。video/hevc の項目を見て、対応解像度が7680×4320(もしくはそれ以上)となっていれば、8K HEVCのハードウェアデコードが可能です。
ソフトウェアデコードには期待しないでください。 ハードウェアデコーダーが非対応の場合、プレイヤーによってはCPUで処理を肩代わりしようとします。しかし8K映像をCPUで処理するのは現実的ではなく、数フレーム表示するのが精一杯で、端末は激しく発熱します。
形式の非対応が疑われます。よくあるのは次の2つです。
H.264(AVC)の8K動画である場合。 H.264は規格上は8Kを扱えますが、それに対応したハードウェアデコーダーを積んだスマートフォンはほとんどありません。8K動画はHEVC(H.265)で用意するのが基本です。
コンテナや音声形式が特殊な場合。 MKVコンテナやDTS音声など、Androidの標準デコーダーが扱えない組み合わせだと、映像が対応していても再生に失敗します。MP4コンテナ+AAC音声に変換すると解決することがあります。
音声だけが再生されて映像が出ない場合は、映像コーデックの非対応がほぼ確定です。
デコードは通っているが、処理が追いついていない状態です。効果が大きい順に3つの手、そして1つの裏技があります。
1. フレームレートを半分にする。 60fpsを30fpsに落とすと、デコードの負荷はおおむね半分になります。解像度を保ったまま負荷を大きく減らせるので、8K動画に対しては最も効果的な手段です。動きの速い映像ではなめらかさが落ちますが、カクついて見られないよりは実用的です。
ffmpeg -i input.mp4 -r 30 -c:v libx265 -crf 22 -tag:v hvc1 -c:a copy output.mp4
2. ビットレートを下げる。 8K動画は100Mbpsを超えることも珍しくありません。高ビットレートはストレージの読み出しとデコードの両方に負荷をかけます。60〜80Mbps程度まで落とすと安定することがあります。
3. 解像度を下げる。 最後の手段です。8Kを4Kにすれば確実に軽くなりますが、VRでは画質の低下がはっきり分かります。他の手を試したうえで検討してください。
4. 再生速度を0.5倍にする。 裏技です。再生速度が半分になるので映像体験としては不完全になりますが、上記の3つを実施せずに8K動画ファイルを無劣化で再生することができます。
再生開始直後は合っているのに、数分後には音声が先行している。これはVR動画で特に起こりやすい現象で、プレイヤー側の設計に起因します。
多くのプレイヤーは音声を基準時計として再生を進めます。音声は途切れると即座に気付かれるため、優先度が高いのです。一方で映像のデコードが間に合わないと、映像だけが遅れていきます。本来はフレームを間引いて追いつくのですが、8K映像ではその間引き処理自体が重く、遅れが解消されないまま蓄積していきます。
この症状はファイル側を変換しても改善しないことがあります。その場合はプレイヤーを変えるのが有効です。同じファイル・同じ端末でも、デコーダーの設定次第で結果が変わります。
プレイヤーの設定が映像の形式と合っていません。次の表を目安に、設定を切り替えてみてください。
| 映像の見え方 | 確認する設定 |
|---|---|
| 左右に同じ絵が2つ並んでいる | SBS(左右分割)を選ぶ |
| 上下に同じ絵が2つ並んでいる | TB(上下分割)を選ぶ |
| 手前のものが奥に見える | 左右の目の割り当てが逆。SBSとTBを入れ替えるか、左右反転の設定を確認 |
| 視界の端が引き伸ばされる | 180度と360度の設定が逆になっている |
ファイル名に _180x180_3dh や _LR といった記号が含まれている場合、それが形式を表しています。3dh や LR は横並び(SBS)、3dv や TB は縦並びです。
手元のファイルがどの形式なのか自体が分からない場合は、VR動画のSBS・TB・180°・360°の違いと見分け方で判別の手順を詳しく説明しています。
PCでffmpegを使った変換は確実ですが、8K動画の再エンコードには時間がかかります。10分の8K動画で、環境によっては1時間以上かかることもあります。
GPUを使ったエンコードに切り替えると大幅に短縮できます。NVIDIA製GPUを搭載したPCであれば、次のような指定が使えます。
ffmpeg -i input.mp4 -r 30 -c:v hevc_nvenc -b:v 70M -tag:v hvc1 -c:a copy output.mp4
また、そもそも見るたびに変換するのは現実的ではありません。一度変換したファイルを保存しておき、次回以降はそれを再生するという運用にすると、手間は初回だけで済みます。
この記事で挙げた問題のうち、音ズレとカクつきはプレイヤー側で改善できる余地があります。OctaVRは、まさにその点を軸に開発したAndroid向けのVR動画プレイヤーです。
高ビットレートの8Kファイルでもデコーダーの初期化に失敗しにくいよう設定を調整しており、音声と映像の同期を保ったまま再生します。また、端末がデコードはできるものの処理が追いつかない場合に備えて、60fpsから30fpsへの変換をアプリ内で実行する機能を用意しています。変換したファイルは次回以降そのまま使われるので、PCでの作業が不要になります。
180度/360度、SBS/TB、平面2Dのいずれにも対応し、視野角やIPDの調整、首の動きだけでメニューを操作できるハンズフリー機能も備えています。無料で試せます。
なお、繰り返しになりますが、端末のハードウェアデコーダーが8Kに対応していない場合は、どのプレイヤーでも解決しません。その場合はファイル側を4Kに落とすか、対応した端末を用意する以外に方法はありません。まずは自分の端末が何に対応しているかを確認するところから始めてください。