Fehlerprotokollierung

Standardmäßig protokolliert ExoPlayer nur Fehler. Zum Protokollieren von Spielerereignissen kann die Klasse EventLogger verwendet werden. Die zusätzliche Protokollierung kann hilfreich sein, um zu verstehen, was der Player tut, und um Probleme bei der Wiedergabe zu beheben. EventLogger implementiert AnalyticsListener, sodass die Registrierung einer Instanz mit einer ExoPlayer ganz einfach ist:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Am einfachsten können Sie das Protokoll über den Tab „logcat“ in Android Studio beobachten. Sie können Ihre App anhand des Paketnamens (androidx.media3.demo.main bei Verwendung der Demo-App) als debugbarer Prozess auswählen und dem Tab „Logcat“ mitteilen, dass nur für diese App protokolliert werden soll, indem Sie Nur ausgewählte Anwendung anzeigen auswählen. Sie können das Logging mit dem Ausdruck EventLogger|ExoPlayerImpl weiter filtern, um nur Logging von EventLogger und dem Player selbst zu erhalten.

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

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Spielerinformationen

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

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 den folgenden 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, nachdem der Player vorbereitet wurde. Der Nutzer pausiert die Wiedergabe nach 9,4 Sekunden und setzt sie eine Sekunde später nach 10,4 Sekunden fort. Die Wiedergabe endet zehn Sekunden später bei 20,4 Sekunden. Die häufigsten Elemente in eckigen Klammern sind:

  • [eventTime=float]: Die Zeit seit der Erstellung des Spielers.
  • [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 Bundesstaates an.

Medientracks

Informationen zu Titeln werden protokolliert, wenn sich die verfügbaren oder ausgewählten Titel ändern. Das passiert mindestens einmal zu Beginn der Wiedergabe. Das folgende Beispiel zeigt das Track-Logging 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 Fähigkeiten des Geräts übersteigt, wie durch supported=NO_EXCEEDS_CAPABILITIES angezeigt. Der Player wechselt während der Wiedergabe zwischen den ausgewählten Videotracks. Wenn der Spieler von einem Titel zu einem anderen wechselt, wird dies 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 Protokollzeile gibt an, dass der Player drei Sekunden nach Beginn der Medienwiedergabe zum Videotrack mit einer Auflösung von 640 x 360 gewechselt ist.

Auswahl des Decoders

In den meisten Fällen rendert ExoPlayer Medien mithilfe eines MediaCodec, das von der zugrunde liegenden Plattform abgerufen wird. Wenn ein Decoder initialisiert wird, wird dies in Zeilen wie diesen 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]