許多 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.
此錯誤最常見的原因是測試執行期間的網路連線品質不佳。如果裝置具備良好的網路連線,可能是因為測試在呼叫平台元件 (例如 MediaCodec
、MediaDrm
或 AudioTrack
) 時中斷。請在測試程序中檢查執行緒的呼叫堆疊,確認情況是否為如此。