OEM のテスト

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).

このエラーは、テスト対象の動画デコーダがバッファを誤って破棄、挿入、並べ替えることが原因で発生することがほとんどです。上記の例では、テストは MediaCodec.dequeueOutputBuffer からプレゼンテーション タイムスタンプ 134766000 のバッファをデキューすることを想定していましたが、実際にはプレゼンテーション タイムスタンプ 134733000 のバッファをデキューしたことがわかりました。このエラーが発生した場合は、デコーダの実装、特にバッファを破棄せずに適応型解像度スイッチを正しく処理していることを確認することをおすすめします。

ドロップされたバッファが多すぎる

Logcat に次のようなエラーが記録されます。

junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.

この失敗はパフォーマンスの問題です。テスト対象の動画デコーダが多数のバッファのデコードを遅延させています。上記の例では、ExoPlayer は 200 個のバッファをドロップしました。これは、25 個の制限を課すテストで、バッファがデキューされるまでに遅延したためです。最も明らかな原因は、動画デコーダのバッファのデコードが遅すぎることです。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.

このエラーは、テスト実行中のネットワーク接続不良が原因で発生することがほとんどです。デバイスのネットワーク接続が良好な場合、テストがプラットフォーム コンポーネント(MediaCodecMediaDrmAudioTrack など)への呼び出しでスタックしている可能性があります。テスト プロセスのスレッドのコールスタックを調べて、このケースに該当するかどうかを確認してください。