動画の切り替えで画面が暗転する理由:プリロード、キャッシュとシームレスな分岐再生
分岐の切り替えで画面が暗転する原因は、通常、プレーヤーの「性能が悪い」というだけでは説明できません。次の動画の準備ができていない、最初のフレームがまだデコードされていない、描画用テクスチャがクリアされた、あるいは二つの素材自体に視覚的な連続性がない場合があります。対策では、エンコード、プリロード、二つのプレーヤー間の切り替え、キャッシュの予算、出口ショットの設計を併せて扱う必要があります。

はじめに
分岐の切り替えで画面が暗転する原因は、通常、プレーヤーの「性能が悪い」というだけでは説明できません。次の動画の準備ができていない、最初のフレームがまだデコードされていない、描画用テクスチャがクリアされた、あるいは二つの素材自体に視覚的な連続性がない場合があります。対策では、エンコード、プリロード、二つのプレーヤー間の切り替え、キャッシュの予算、出口ショットの設計を併せて扱う必要があります。
まず暗転を測定可能な段階に分ける
プレイヤーが選択を確定してから次の動画の最初のフレームが見えるまでの処理は、経路の確定、ファイルの特定、読み込み、コンテナの解析、最初のフレームのデコード、テクスチャのアップロード、音声の開始、表示に分けられます。各段階にタイムスタンプを記録して初めて、どこに時間がかかっているかが分かります。「読み込みに500ミリ秒かかった」とだけ記録しても、ネットワーク、ディスク、キーフレームのどれが原因かは判断できません。
開発用画面に、現在のノード、候補ノード、準備状態、バッファ済みの再生時間、最初のフレームまでの所要時間を表示します。コールドスタートと2回目の再生をそれぞれテストしてください。2回目は滑らかなのに初回は暗転するなら、通常はキャッシュが本当の問題を隠していることを示します。
選択肢が現れる前に候補となる出口を準備する
動画プレーヤーが間もなく表示される選択肢を把握した時点で、クリックされてから読み込むのではなく、次に再生される可能性があるすべての動画の準備を始めるべきです。候補が二つだけなら、両方の最初のフレームと少量のバッファをプリロードできます。候補が多い場合は、選択確率、ネットワーク、メモリに応じて優先度を分け、少なくともデフォルトのルートやよく選ばれるルートを準備します。
Unityの VideoPlayer.Prepare は再生の準備を事前に行い、完了時にイベントを通知します。これを使えば「ファイルの準備」を選択段階より前に移せますが、対象デバイスでデコードと描画の性能を測定する必要はあります。Unity VideoPlayer.Prepare
二つのプレーヤーまたはテクスチャで引き継ぐ
単一のプレーヤーでURLを切り替えると、現在の映像がクリアされることがよくあります。より確実な方法は、Aで現在のクリップを再生し、Bで次のクリップをバックグラウンドで準備することです。プレイヤーが選択を確定した時点で、Bはすでに最初のフレームで停止しており、映像を1フレーム以内に切り替えます。その後、Aを解放し、さらに先の候補を準備します。音声にも、同期したクロスフェードか正確なタイミングでの切り替えが必要です。
二つのプレーヤーを使うと、メモリ、デコーダー、プラットフォーム互換性にかかるコストが増えます。一部のモバイルデバイスでは、高解像度の動画2本を同時にハードウェアデコードできません。そのため、次の動画の最初のフレームのテクスチャだけを保持できるか、あるいは出口で短い静止フレームを使ってごく短い切り替えを隠せるかをテストする必要があります。隠すことは美的な手法であり、無期限に待たせる口実ではありません。
エンコードが再生開始の速さを決める
GOPが長いと、プレーヤーは目的のフレームを表示するために、より多くのデータをさかのぼる必要があります。分岐クリップでは入口付近にキーフレームを配置し、エンコーダー、解像度、フレームレート、色空間、音声パラメーターを統一します。二つの素材のパラメーターが異なると、プレーヤーがデコードパイプラインを再構築し、遅延やちらつきが増える可能性があります。
キーフレーム間隔を単純に極端に短くしないでください。ファイルサイズとビットレートが増えます。代表的なデバイスをいくつか選び、実際の出口クリップで最初のフレームまでの時間、ピークメモリ使用量、パッケージサイズを測定してから、エンコードのプリセットを決めます。
映像の連続性も「見かけ上の暗転」を生む
技術的な切り替えが0ミリ秒でも、出口と入口の構図、動作、露出、環境音が連続していなければ、プレイヤーは断絶を感じます。撮影時に出口での姿勢と視線を設計し、編集時にはつなぎ合わせられるフレームを残し、音声では環境音のベースをカットの前後に連続させます。必要に応じて、スマートフォンの画面、まばたき、ドアによる遮蔽を自然なトランジションとして使います。
選択画面が表示されている間、背景動画は緊張感があり、かつ停止状態を維持できるショットで止めるべきです。登場人物の口が音節の途中で止まったり、手が宙に浮いたままだったりすると、どんな待ち時間も不自然に見えます。
キャッシュに予算と破棄ルールを設ける
リソースを、現在必須のもの、次の段階の候補、直近の巻き戻し用、さらに先のコンテンツに分けます。デバイスのメモリとディスクに応じて上限を設定し、現在のリソースと候補を優先して保持し、章を離れたら到達できなくなった分岐を解放します。キャッシュキーにはアセットのバージョンとエンコード仕様を含め、更新後も古いファイルが再生され続けることを防ぎます。
ストリーミング環境では、低速・不安定なネットワークへの対応も定義する必要があります。安全に再生できるバッファが確保されてから選択を有効にする、ビットレートを下げる、章全体を事前にダウンロードする、あるいは明確な読み込み画面を表示する方法があります。カウントダウンが始まってから、候補の動画が準備できていないと気づく状況にしてはいけません。
受け入れ判定に使える指標を定める
選択の確定から次の動画の最初のフレームまでの時間は、P50、P95、最悪値をすべて測定します。同時に、映像と音声の同期、フレーム落ち、ピークメモリ使用量、失敗からの復旧も記録します。低性能の対象デバイス、コールドキャッシュ、バックグラウンドからの復帰、リソースのダウンロード中断をカバーしてください。指標は作品のテンポによって決まりますが、「肉眼では分からない」はデータの代わりにはなりません。
準備に失敗したら、現在の映像を保持して再試行する、ビットレートを下げる、または設計済みのフォールバックノードへ移ります。そのまま黒い画面で固まってはいけません。失敗のたびに、アセットID、エラー、デバイス情報をログに記録します。
最後に、選択レイヤー自体も測定に含めます。ボタンアニメーションの終了、入力のロック、プレーヤーの切り替えの間に空白があれば、それも読み込みと誤認されます。画面録画をフレーム単位で確認し、性能ログとプレイヤーが実際に見るタイミングが一致していることを確かめます。
次のステップ:最もよく使われる分岐、ビットレートが最も高い分岐、最も複雑な分岐の3か所を選び、コールドキャッシュの対象デバイスで段階ごとに時間を測定します。まず最悪の暗転がどの段階で起きたかを特定し、それからエンコード、読み込み、ショットのどれを変更するか決めます。


