Fehlerprotokollierung

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

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Sie können das Protokoll am einfachsten über den Logcat-Tab in Android Studio einsehen. Sie können die Anwendung anhand des Paketnamens als debugfähiger Prozess auswählen (androidx.media3.demo.main bei Verwendung der Demo-App) und den Logcat-Tab anweisen, nur für diese Anwendung zu protokollieren. Wählen Sie dazu Show only selected application (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.

Alternativ können Sie den Logcat-Tab von Android Studio auch über die Konsole verwenden. Beispiel:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Spielerinformationen

Die Klasse ExoPlayerImpl liefert zwei wichtige Zeilen zur Player-Version, zum Gerät, zum Betriebssystem, auf dem die App ausgeführt wird, und 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 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 10 Sekunden später bei 20,4 Sekunden. Die gängigen Elemente in den eckigen Klammern sind:

  • [eventTime=float]: Die tatsächlich verstrichene Zeit seit 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 Bundesstaats an.

Medientracks

Track-Informationen werden protokolliert, wenn sich die verfügbaren oder ausgewählten Titel ändern. Dies geschieht mindestens einmal beim Start 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 Videospuren ausgewählt. Der fünfte Videospur ist nicht ausgewählt, da er die durch supported=NO_EXCEEDS_CAPABILITIES angegebenen Gerätefunktionen überschreitet. Der Player passt sich während der Wiedergabe zwischen den ausgewählten Videotracks an. Wenn sich der Spieler von einem Track an einen anderen anpasst, 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 zeigt an, dass der Player auf die drei Sekunden lange Videospur mit der Auflösung 640 x 360 umgestellt hat.

Decoderauswahl

In den meisten Fällen rendert ExoPlayer Medien mit einem MediaCodec, der von der zugrunde liegenden Plattform abgerufen wurde. 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]