大量 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.
此失败通常是由于测试运行期间网络连接不佳所致。如果设备看似网络连接良好,则有可能
测试在调用平台组件(例如
MediaCodec
、MediaDrm
或 AudioTrack
)。检查
线程,以确定是否属于这种情况。