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 的 运行窗口。

常见故障模式

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