ExoPlayer 被大量的 Android 应用使用。作为 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).
此故障通常是由正在测试的视频解码器错误地丢弃、插入或重新排序缓冲区引起的。在上面的示例中,测试预计从 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
)时卡住了。检查测试进程中线程的调用堆栈以确定是否为这种情况。