Журнал отладки

По умолчанию ExoPlayer регистрирует только ошибки. Для регистрации событий проигрывателя можно использовать класс EventLogger. Дополнительные журналы могут помочь понять, что делает пользователь, а также устранить неполадки воспроизведения. EventLogger реализует AnalyticsListener, поэтому вы можете зарегистрировать экземпляр с помощью ExoPlayer:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Проще всего просматривать журнал на вкладке Logcat в Android Studio. Вы можете выбрать свое приложение в качестве процесса для отладки по названию пакета (androidx.media3.demo.main, если вы используете демонстрационное приложение) и настроить вкладку logcat так, чтобы в ней регистрировались только данные для этого приложения. Для этого выберите show only selected application (показывать только выбранное приложение). Вы можете отфильтровать журналы с помощью выражения EventLogger|ExoPlayerImpl, чтобы получать данные только от EventLogger и самого проигрывателя.

Вместо вкладки logcat в Android Studio можно использовать консоль. Пример:

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 секунды, а затем возобновил его через секунду, на отметке 10,4 секунды. Воспроизведение закончится через 10 секунд, на отметке 20,4 секунды. В квадратных скобках указываются следующие элементы:

  • [eventTime=float] – время с момента создания игрока.
  • [mediaPos=float] – текущая позиция воспроизведения.
  • [window=int] – индекс текущего окна.
  • [period=int] – текущий период в этом окне.

Последние элементы в каждой строке указывают значение сообщаемого состояния.

Медиадорожки

Информация о дорожках регистрируется, когда меняются доступные или выбранные дорожки. Это происходит хотя бы один раз в начале воспроизведения. В примере ниже показана регистрация треков для адаптивного потока:

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]

Эта строка журнала указывает, что проигрыватель переключился на видео с разрешением 640 x 360 через три секунды после начала воспроизведения.

Выбор декодера

В большинстве случаев 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]