OEM 测试

许多 Android 应用都在使用 ExoPlayer。作为原始设备制造商 (OEM),请务必确保 ExoPlayer 在新设备上以及现有设备的新平台 build 上都能正常运行。本页将介绍我们建议在推出设备或平台 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)时卡住。请检查测试过程中线程的调用堆栈,以确定情况是否如此。