大量 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.
這類失敗通常是因為測試執行期間的網路連線品質不佳。如果裝置似乎有良好的網路連線,則可能是測試在呼叫平台元件 (例如 MediaCodec
、MediaDrm
或 AudioTrack
) 時卡住。請檢查測試程序中執行緒的呼叫堆疊,確認是否為此情況。