ExoPlayer は、多くの Android アプリで使用されています。OEM として、ExoPlayer が新しいデバイスと、既存のデバイス用の新しいプラットフォーム ビルドの両方で正しく動作するようにすることが重要です。このページでは、デバイスまたはプラットフォームの OTA を配布する前に実施することが推奨される互換性テストと、テストの実行時に発生する一般的な障害モードについて説明します。
テストを実行する
ExoPlayer の再生テストを実行するには、まず GitHub から ExoPlayer の最新リリースを確認します。その後、コマンドラインまたは Android Studio からテストを実行できます。
コマンドライン
ルート ディレクトリから、再生テストをビルドしてインストールします。
./gradlew :test-exoplayer-playback:installDebug
次に、GTS パッケージの再生テストを実行します。
adb shell am instrument -w -r -e debug false \ -e package androidx.media3.test.exoplayer.playback.gts \ androidx.media3.test.exoplayer.playback.test/androidx.test.runner.AndroidJUnitRunner
テスト結果は STDOUT に表示されます。
Android Studio
ExoPlayer プロジェクトを開いて playbacktests
モジュールに移動し、gts
フォルダを右クリックしてテストを実行します。テスト結果が Android Studio の [Run] ウィンドウに表示されます。
一般的な障害モード
ExoPlayer の再生テストの実行中に発生する一般的な障害モードのいくつかを、それぞれのケースで考えられる根本原因と合わせて説明します。今後さらに障害モードが発見されると、このリストに追加されます。
動画バッファのプレゼンテーション タイムスタンプが想定外です
logcat に次のようなエラーが記録されます。
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
このエラーはほとんどの場合、テスト対象の動画デコーダがバッファの破棄、挿入、並べ替えを誤って行ったことが原因で発生します。上記の例では、テストでは、プレゼンテーション タイムスタンプが 134766000
のバッファを MediaCodec.dequeueOutputBuffer
からキューから取り出すことが想定されていましたが、プレゼンテーション タイムスタンプが 134733000
のバッファをキューからデキューしたことがわかりました。このエラーが発生した場合は、デコーダの実装を確認することをおすすめします。特に、バッファを破棄することなく適応型解像度の切り替えを正しく処理する点を確認してください。
ドロップしたバッファが多すぎる
logcat に次のようなエラーが記録されます。
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
これはパフォーマンスの問題であり、テスト対象の動画デコーダが多数のバッファのデコードを遅らせていました。上記の例では、上限を 25 とするテストで、ExoPlayer はキューから出されるまでに遅延していたため 200 バッファをドロップしました。最も明白な原因は、動画デコーダによるバッファのデコードが非常に遅いことです。Widevine で保護されたコンテンツを再生するテストのサブセットでのみエラーが発生している場合は、バッファの復号のプラットフォーム オペレーションが遅すぎる可能性があります。これらのコンポーネントのパフォーマンスを確認し、高速化するための最適化がないか確認することをおすすめします。
ネイティブ ウィンドウを認証できませんでした
logcat に次のようなエラーが記録されます。
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
この失敗は、プラットフォームがセキュア ビットフラグを正しく設定していないことを示しています。
テストがタイムアウトしました
logcat に次のようなエラーが記録されます。
AssertionFailedError: Test timed out after 300000 ms.
この障害は、ほとんどの場合、テスト実行中のネットワーク接続が不安定なことが原因で発生します。デバイスのネットワーク接続が良好な場合は、プラットフォーム コンポーネント(MediaCodec
、MediaDrm
、AudioTrack
など)の呼び出しが停止している可能性があります。テストプロセスのスレッドのコールスタックを調べて、この問題が発生しているかどうかを確認します。