По умолчанию ExoPlayer регистрирует только ошибки. Для регистрации событий игрока можно использовать класс EventLogger
. Дополнительное ведение журнала может быть полезно для понимания того, что делает проигрыватель, а также для устранения проблем с воспроизведением. EventLogger
реализует AnalyticsListener
, поэтому зарегистрировать экземпляр с помощью ExoPlayer
очень просто:
Котлин
player.addAnalyticsListener(EventLogger())
Ява
player.addAnalyticsListener(new EventLogger());
Самый простой способ наблюдать за журналом — использовать вкладку logcat в Android Studio. Вы можете выбрать свое приложение как отлаживаемый процесс по имени пакета ( androidx.media3.demo.main
при использовании демонстрационного приложения) и указать вкладке logcat вести журнал только для этого приложения, выбрав «Показать только выбранное приложение» . Можно дополнительно фильтровать журналирование с помощью выражения 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 секунды. Воспроизведение заканчивается через десять секунд на отметке 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]
Эта строка журнала указывает на то, что проигрыватель переключился на видеодорожку с разрешением 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]