Consignation des données de débogage

Par défaut, ExoPlayer ne consigne que les erreurs. La classe EventLogger peut être utilisée pour enregistrer les événements du lecteur. La journalisation supplémentaire qu'il fournit peut être utile pour comprendre ce que fait le lecteur, ainsi que pour déboguer les problèmes de lecture. EventLogger implémente AnalyticsListener, ce qui facilite l'enregistrement d'une instance avec un ExoPlayer :

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Le moyen le plus simple d'observer le journal consiste à utiliser l'onglet Logcat d'Android Studio. Vous pouvez sélectionner votre application comme processus débogable par le nom du package (androidx.media3.demo.main si vous utilisez l'application de démonstration) et indiquer à l'onglet Logcat de n'enregistrer les journaux que pour cette application en sélectionnant Afficher uniquement l'application sélectionnée. Il est possible de filtrer davantage les journaux avec l'expression EventLogger|ExoPlayerImpl pour n'obtenir que les journaux de EventLogger et du lecteur lui-même.

Vous pouvez également utiliser la console au lieu de l'onglet Logcat d'Android Studio. Exemple :

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Informations sur le joueur

La classe ExoPlayerImpl fournit deux lignes importantes sur la version du lecteur, l'appareil et l'OS sur lesquels l'application s'exécute, ainsi que les modules ExoPlayer qui ont été chargés :

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]

État de la lecture

Les modifications de l'état du lecteur sont consignées dans des lignes comme celles-ci :

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]

Dans cet exemple, la lecture commence 0,93 seconde après la préparation du lecteur. L'utilisateur met la lecture en pause après 9,4 secondes, puis la reprend une seconde plus tard, à 10,4 secondes. La lecture se termine dix secondes plus tard, à 20,4 secondes. Les éléments courants entre crochets sont les suivants :

  • [eventTime=float] : temps écoulé depuis la création du joueur (heure de l'horloge).
  • [mediaPos=float] : position de lecture actuelle.
  • [window=int] : index de la fenêtre actuelle.
  • [period=int] : période actuelle dans cette fenêtre.

Les derniers éléments de chaque ligne indiquent la valeur de l'état signalé.

Pistes multimédias

Les informations de piste sont enregistrées lorsque les pistes disponibles ou sélectionnées changent. Cela se produit au moins une fois au début de la lecture. L'exemple ci-dessous montre la journalisation des pistes pour un flux adaptatif :

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

Dans cet exemple, le lecteur a sélectionné quatre des cinq pistes vidéo disponibles. La cinquième piste vidéo n'est pas sélectionnée, car elle dépasse les capacités de l'appareil, comme indiqué par supported=NO_EXCEEDS_CAPABILITIES. Le lecteur s'adaptera aux pistes vidéo sélectionnées pendant la lecture. Lorsque le lecteur passe d'une piste à une autre, cela est enregistré sur une ligne comme celle ci-dessous :

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]

Cette ligne de journal indique que le lecteur est passé à la piste vidéo de résolution 640x360 trois secondes après le début du contenu multimédia.

Sélection du décodeur

Dans la plupart des cas, ExoPlayer affiche le contenu multimédia à l'aide d'un MediaCodec obtenu à partir de la plate-forme sous-jacente. Lorsqu'un décodeur est initialisé, cela est consigné dans des lignes comme celles-ci :

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]