原始設備製造商 (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 的測試時,這些緩衝區在從佇列中移除時已過期。最明顯的原因是影片解碼器解碼緩衝區的速度太慢。如果只有部分測試會失敗 很有可能是平台運作 緩衝區解密速度太慢建議您檢查這些元件的效能,並查看是否可進行任何最佳化,以便加快速度。

無法驗證原生視窗

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) 時卡住。請檢查測試程序中執行緒的呼叫堆疊,確認是否為此情況。