许多 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 的“运行窗口”中。
常见故障模式
下面介绍了一些在运行 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.
此失败最常见的原因是测试运行期间网络连接质量较差。如果设备似乎具有良好的网络连接,则可能是测试在调用平台组件(例如 MediaCodec、MediaDrm 或 AudioTrack)时卡住了。检查测试进程中线程的调用堆栈,以确定是否是这种情况。