原始設備製造商 (OEM) 測試

許多 Android 應用程式都使用了 ExoPlayer。原始設備製造商 (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.

這種故障指的是效能問題,因為測試中的影片解碼器延遲了大量緩衝區解碼。在上述範例中,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) 時中斷。請在測試程序中檢查執行緒的呼叫堆疊,確認情況是否為如此。