Logowanie debugowania

Domyślnie ExoPlayer rejestruje tylko błędy. Do rejestrowania zdarzeń odtwarzacza można używać klasy EventLogger. Dodatkowe rejestrowanie może być przydatne do zrozumienia, co robi odtwarzacz, a także do debugowania problemów z odtwarzaniem. EventLogger implementuje AnalyticsListener, więc zarejestrowanie instancji za pomocą ExoPlayer jest proste:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Najłatwiej jest obserwować log za pomocą karty logcat w Android Studio. Możesz wybrać aplikację jako proces, który można debugować, według nazwy pakietu (androidx.media3.demo.main, jeśli używasz aplikacji demonstracyjnej) i skonfigurować kartę logcat tak, aby rejestrowała tylko tę aplikację, wybierając show only selected application (pokazuj tylko wybraną aplikację). Logowanie można dodatkowo filtrować za pomocą wyrażenia EventLogger|ExoPlayerImpl, aby otrzymywać tylko logi z EventLogger i samego odtwarzacza.

Alternatywą dla korzystania z karty logcat w Android Studio jest używanie konsoli. Przykład:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Informacje o graczu

Klasa ExoPlayerImpl dostarcza 2 ważne wiersze informacji o wersji odtwarzacza, urządzeniu i systemie operacyjnym, na którym działa aplikacja, oraz o załadowanych modułach ExoPlayera:

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]

Stan odtwarzania

Zmiany stanu odtwarzacza są rejestrowane w wierszach takich jak te:

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]

W tym przykładzie odtwarzanie rozpoczyna się 0,93 sekundy po przygotowaniu odtwarzacza. Użytkownik wstrzymuje odtwarzanie po 9,4 sekundy, a wznawia je sekundę później, po 10,4 sekundy. Odtwarzanie zakończy się 10 sekund później, czyli po 20,4 sekundy. Elementy wspólne w nawiasach kwadratowych to:

  • [eventTime=float]: czas od utworzenia gracza.
  • [mediaPos=float]: bieżąca pozycja odtwarzania.
  • [window=int]: bieżący indeks okna.
  • [period=int]: bieżący okres w tym przedziale.

Ostatnie elementy w każdym wierszu wskazują wartość zgłaszanego stanu.

Ścieżki multimediów

Informacje o ścieżkach są rejestrowane, gdy zmienią się dostępne lub wybrane ścieżki. Dzieje się to co najmniej raz na początku odtwarzania. Przykład poniżej pokazuje śledzenie strumienia adaptacyjnego:

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: ]

W tym przykładzie odtwarzacz wybrał 4 z 5 dostępnych ścieżek wideo. Piąta ścieżka wideo nie jest wybrana, ponieważ przekracza możliwości urządzenia, co wskazuje supported=NO_EXCEEDS_CAPABILITIES. Odtwarzacz będzie dostosowywać się do wybranych ścieżek wideo podczas odtwarzania. Gdy odtwarzacz przechodzi z jednego utworu na drugi, jest to rejestrowane w wierszu podobnym do tego poniżej:

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]

Ten wiersz dziennika wskazuje, że odtwarzacz przełączył się na ścieżkę wideo o rozdzielczości 640x360 w 3 sekundzie odtwarzania.

Wybór dekodera

W większości przypadków ExoPlayer renderuje multimedia za pomocą MediaCodec uzyskanej z platformy bazowej. Gdy dekoder zostanie zainicjowany, zostanie to zarejestrowane w wierszach podobnych do tych:

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]