调试日志记录

默认情况下,ExoPlayer 仅记录错误。如需记录玩家事件,可以使用 EventLogger 类。它提供的额外日志记录有助于了解播放器正在执行的操作以及调试播放问题。EventLogger 会实现 AnalyticsListener,因此使用 ExoPlayer 注册实例非常简单:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

观察日志的最简单方法是使用 Android Studio 的 logcat 标签页。您可以按软件包名称(如果使用演示版应用,则为 androidx.media3.demo.main)选择您的应用作为可调试进程,并选择 show only selected application,让 logcat 标签页仅记录该应用。可以使用表达式 EventLogger|ExoPlayerImpl 进一步过滤日志记录,以仅获取 EventLogger 和玩家本身的日志记录。

除了使用 Android Studio 的 logcat 标签页,您还可以使用控制台。例如:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

播放器信息

ExoPlayerImpl 类会提供关于播放器版本(运行应用的设备和操作系统,以及已加载的 ExoPlayer 模块)的两行重要代码:

ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33]
ExoPlayerImpl: Release 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33] [media3.common, media3.datasource, media3.ui, media3.exoplayer, media3.decoder, media3.exoplayer.dash, media3.extractor]

播放状态

系统会以如下几行记录播放器状态变化:

EventLogger: playWhenReady [eventTime=0.00, mediaPos=0.00, window=0, true, USER_REQUEST]
EventLogger: state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]
EventLogger: state [eventTime=0.93, mediaPos=0.00, window=0, period=0, READY]
EventLogger: isPlaying [eventTime=0.93, mediaPos=0.00, window=0, period=0, true]
EventLogger: playWhenReady [eventTime=9.40, mediaPos=8.40, window=0, period=0, false, USER_REQUEST]
EventLogger: isPlaying [eventTime=9.40, mediaPos=8.40, window=0, period=0, false]
EventLogger: playWhenReady [eventTime=10.40, mediaPos=8.40, window=0, period=0, true, USER_REQUEST]
EventLogger: isPlaying [eventTime=10.40, mediaPos=8.40, window=0, period=0, true]
EventLogger: state [eventTime=20.40, mediaPos=18.40, window=0, period=0, ENDED]
EventLogger: isPlaying [eventTime=20.40, mediaPos=18.40, window=0, period=0, false]

在此示例中,播放在播放器准备好后 0.93 秒开始。用户在 9.4 秒后暂停播放,然后在 1 秒后在 10.4 秒后继续播放。播放 10 秒钟后第 20.4 秒结束。方括号内的常见元素包括:

  • [eventTime=float]:自创建播放器以来的挂钟时间。
  • [mediaPos=float]:当前的播放位置。
  • [window=int]:当前窗口索引。
  • [period=int]:该窗口中的当前时间段。

每行中的最后元素表示所报告的状态的值。

Media 跟踪

当可用或所选轨道发生更改时,系统会记录轨道信息。这种情况在播放开始时至少发生一次。下例显示了自适应流的跟踪日志记录:

EventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,
EventLogger:   group [
EventLogger:     [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES
EventLogger:     [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES
EventLogger:     [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES
EventLogger:     [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES
EventLogger:     [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES
EventLogger:   ]
EventLogger:   group [
EventLogger:     [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES
EventLogger:     [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES
EventLogger:   ]
EventLogger: ]

在此示例中,播放器选择了五个可用视频轨道中的四个。未选择第五个视频轨道,因为它超出了设备的功能(如 supported=NO_EXCEEDS_CAPABILITIES 所示)。在播放过程中,播放器会在所选视频轨道之间进行调整。当玩家从一个曲目调整到另一个曲目时,它会记录在如下所示的行中:

EventLogger: downstreamFormat [eventTime=3.64, mediaPos=3.00, window=0, period=0, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0]

此日志行表示播放器在播放 3 秒钟后切换到分辨率为 640x360 的视频片段。

解码器选择

在大多数情况下,ExoPlayer 使用从底层平台获取的 MediaCodec 来渲染媒体。初始化解码器后,系统会记录如下几行记录:

EventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX.qcom.video.decoder.avc]
EventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder]