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

許多 Android 應用程式都使用 ExoPlayer。身為原始設備製造商,請務必確保 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) 時卡住。請檢查測試程序中執行緒的呼叫堆疊,確認是否發生這種情況。