SteamDeckで低fpsになるとElectraPlayerの動画再生がされない問題

SteamDeckではfpsが25未満ぐらいになると動画が再生されなくなるようです。

動画の再生にはElectraPlayerを使用しており、動画のフォーマットはH.264です。

https://d1iv7db44yhgxn.cloudfront.net/documentation/attachments/dbd57f6a\-c6be\-40fc\-a1bc\-90038c4faaca/samplevideo.mp4

こちらで提供されているサンプル動画で現象が発生いたします。

<br/>

負荷が高いと遅くなるのではなく完全に停止し、CVar等を変更してfpsを30fps程度まで向上させると動画の再生が開始されます。

再現手順に記載した方法で再現させたプロジェクトのログを添付いたしました。

r.ShadowQuality 0

のコマンドを打って少しカメラを動かしたら再生するようになっております。

<br/>

WindowsデスクトップPCではこの問題は発生しておりません。

基本的にゲームのfpsがそこまで落ちること自体を避けようとはしておりますが、落ちてしまうケースも考えられ、その場合の対策がありましたらご教授いただけるでしょうか。

よろしくお願いいたします。

[Attachment Removed]

もう一度添付したら出来ましたので、サンプルプロジェクトも添付しております。

[Attachment Removed]

お世話になっております。

本事象はElectraPlayerのバグではなくUE Media Frameworkの設計上の仕様となっており、現状エンジン側での根本的な修正予定は確認されておりません。この事象の現実的な回避策としては、「FPSを下がらないようにCVar等で負荷を調整して頂く」「動画ファイルから音声トラックを除去し、音声を別系統で再生する」「PSOキャッシュを事前にウォームアップして頂く」等が挙げられます。おそらくPCとSteamDeckではスペックに有意差があり、PC版ではフレームレートがそれほど低下しなかった都合により問題が表面化しなかったことが推測されます。

ElectraPlayerの動画ファイルに映像トラックと音声トラックの両方が含まれている場合、音声トラックがマスタークロックとして動作しますが、FPSが低下すると映像フレームはレンダリング時にのみ消費される動作から消費されずにキューに滞留し、音声クロックが先行することで映像フレームが古すぎると判断して破棄される動作となります。結果として、動画は全フレームを順番でデコードしなおさない限り映像が再開されない動作となります。このため、映像トラックと音声トラックを別にすることは、この問題を解決する上では抜本的な方法です。

とはいえ、動画の作り直しや音声と映像の動機などの調整が必要になるため、現実的な方法としてはフレームレートを低下しないようにパフォーマンスを調整して頂く(ないし、フレームレートが低下しないタイミングでのみ動画再生する)方法や、ログからはフレームレートが低下するPSOコンパイルのタイミングと同タイミングで再生されるように見受けられましたので、PSOキャッシュを事前にウォームアップしておく、といった方法が次の案として挙げられます。

[Attachment Removed]

ありがとうございます。

プロジェクトでは無音の動画なのですが、各プラットフォームで安定して再生出来るフォーマットを模索していた頃に無音でも音声トラックがあった方が安定していたため音声トラックを追加しておりましたが、それによって映像が進まない問題があるということですので、改めて音声トラックをなくすことを検討しようと思います。

ただ時期的にもそれを行うリスクもあるため、映像トラックがマスタークロックとして動作するとベストなのですが、そういった変更は可能でしょうか。

お手数ですが、よろしくお願いいたします。

[Attachment Removed]

音声トラックを保持したまま映像トラックを明示的にマスタークロックへ切り替える標準設定はデフォルトでは存在しておりません。一方で、動画ファイル自体を作り直さずに、再生時に音声トラックを非選択にすることは可能です。無音音声が不要であれば、Audio トラックを -1 に指定、または SelectTrack(Audio, -1) を行うことで、Media Framework 上は音声同期を使用しない video-only 再生として扱われます。まずはこちらを SteamDeck で検証いただくのが、ファイル再作成より低リスクな確認手順と考えられます。

例えば、以下のような 再生時にオプション指定するようなことでも実現が可能です(BPからの指定も同様)。

MediaPlayerOptions Options;
Options.TrackSelection = EMediaPlayerOptionTrackSelectMode::UseTrackOptionIndices;
Options.Tracks.Video = 0;
Options.Tracks.Audio = INDEX_NONE; // -1
MediaPlayer->OpenSourceWithOptions(MediaSource, Options);

ただし、この場合Media Framework 側では「有効な音声再生がない」扱いになり、音声クロックではなく映像のみの進行になります。厳密には、"映像フレーム自体をマスタークロックにする"というより、"音声同期を外して video-only のタイミング制御に切り替える"といった挙動です。FPSが低い状況ですと、音声に追い越されて映像が破棄される問題は避けやすくなりますが、映像再生速度はゲームフレーム進行の影響を受ける点には注意が必要です。

[Attachment Removed]

ご返答ありがとうございます。

ご提案いただいた方法でSteamDeckで動画の映像が再生出来ることが確認出来ました。

今回のプロジェクトでは特定のプラットフォームのために無音の音声トラックを入れていただけでしたので、Windowsプラットフォームでのみこの対応を入れることで、どちらも問題が解決できそうです。

ありがとうございました。

[Attachment Removed]