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)。检查 线程,以确定是否属于这种情况。