Fehlerprotokollierung

Standardmäßig protokolliert ExoPlayer nur Fehler. Zum Protokollieren von Player-Ereignissen kann die Klasse EventLogger verwendet werden. Das zusätzliche Logging kann hilfreich sein, um zu verstehen, was der Spieler tut, und um Wiedergabeprobleme zu beheben. EventLogger implementiert AnalyticsListener. Daher ist die Registrierung einer Instanz mit einem ExoPlayer ganz einfach:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Am einfachsten lässt sich das Log über den logcat-Tab in Android Studio aufrufen. Sie können Ihre App als debugfähigen Prozess nach Paketnamen auswählen (androidx.media3.demo.main, wenn Sie die Demo-App verwenden) und auf dem Tab „Logcat“ nur Protokolle für diese App anzeigen lassen, indem Sie Nur ausgewählte Anwendung anzeigen auswählen. Sie können die Protokollierung mit dem Ausdruck EventLogger|ExoPlayerImpl weiter filtern, um nur Protokolle von EventLogger und dem Player selbst zu erhalten.

Alternativ zum Tab „Logcat“ in Android Studio können Sie die Konsole verwenden. Beispiel:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Spielerinformationen

Die Klasse ExoPlayerImpl enthält zwei wichtige Zeilen zur Player-Version, zum Gerät und Betriebssystem, auf dem die App ausgeführt wird, sowie zu den geladenen ExoPlayer-Modulen:

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]

Wiedergabestatus

Änderungen des Player-Status werden in Zeilen wie diesen protokolliert:

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]

In diesem Beispiel beginnt die Wiedergabe 0,93 Sekunden nach der Vorbereitung des Players. Der Nutzer pausiert die Wiedergabe nach 9,4 Sekunden und setzt sie eine Sekunde später bei 10,4 Sekunden fort. Die Wiedergabe endet zehn Sekunden später bei 20,4 Sekunden. Die gängigen Elemente in den eckigen Klammern sind:

  • [eventTime=float]: Die seit der Erstellung des Spielers vergangene Zeit.
  • [mediaPos=float]: Die aktuelle Wiedergabeposition.
  • [window=int]: Der aktuelle Fensterindex.
  • [period=int]: Der aktuelle Zeitraum in diesem Fenster.

Die letzten Elemente in jeder Zeile geben den Wert des gemeldeten Status an.

Medien-Tracks

Informationen zu Tracks werden protokolliert, wenn sich die verfügbaren oder ausgewählten Tracks ändern. Das passiert mindestens einmal zu Beginn der Wiedergabe. Im folgenden Beispiel sehen Sie die Protokollierung von Tracks für einen adaptiven Stream:

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

In diesem Beispiel hat der Nutzer vier der fünf verfügbaren Videotracks ausgewählt. Der fünfte Videotrack ist nicht ausgewählt, da er die Möglichkeiten des Geräts übersteigt, wie durch supported=NO_EXCEEDS_CAPABILITIES angegeben. Der Player wechselt während der Wiedergabe zwischen den ausgewählten Videotracks. Wenn sich der Player von einem Track an einen anderen anpasst, wird das in einer Zeile wie der folgenden protokolliert:

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]

Diese Logzeile gibt an, dass der Player drei Sekunden nach Beginn der Media zum Videotrack mit der Auflösung 640 × 360 gewechselt hat.

Auswahl des Decoders

In den meisten Fällen rendert ExoPlayer Medien mit einem MediaCodec, das von der zugrunde liegenden Plattform abgerufen wird. Wenn ein Decoder initialisiert wird, wird dies in Zeilen wie den folgenden protokolliert:

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]