Fehlerprotokollierung

Standardmäßig protokolliert ExoPlayer nur Fehler. Zum Protokollieren von Spielerereignissen kann die Klasse EventLogger verwendet werden. Die zusätzlichen Protokolle können hilfreich sein, um zu verstehen, was der Player tut, und um Wiedergabeprobleme zu beheben. EventLogger implementiert AnalyticsListener, sodass Sie eine Instanz mit einem ExoPlayer registrieren können:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Verwenden Sie den Logcat-Tab in Android Studio, um das Log zu beobachten. Sie können Ihre App anhand des Paketnamens (androidx.media3.demo.main, wenn Sie die Demo-App verwenden) als debugfähigen Prozess auswählen und auf dem Tab „Logcat“ festlegen, dass nur für diese App protokolliert werden soll. Wählen Sie dazu Nur ausgewählte Anwendung anzeigen aus. Sie können das Logging mit dem Ausdruck EventLogger|ExoPlayerImpl weiter filtern, um nur Logging von EventLogger und dem Player selbst zu erhalten.

Eine Alternative zur Verwendung des Logcat-Tabs von Android Studio ist die Verwendung der Konsole. Beispiel:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Spielerinformationen

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

ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33] [Canary:ON]
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 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 Uhrzeit seit der Erstellung des Players.
  • [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. Dies geschieht 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 Player vier der fünf verfügbaren Videotracks ausgewählt. Der fünfte Videotrack wird nicht ausgewählt, da er die Funktionen des Geräts überschreitet, wie durch supported=NO_EXCEEDS_CAPABILITIES angegeben. Der Player wechselt während der Wiedergabe zwischen den ausgewählten Videotracks. Wenn der Player von einem Track 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 × 360 gewechselt hat.

Decoder-Auswahl

In den meisten Fällen rendert ExoPlayer Medien mit einer MediaCodec, die 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]