Consignation des données de débogage

Par défaut, ExoPlayer ne consigne que les erreurs. Pour consigner les événements du lecteur, vous pouvez utiliser la classe EventLogger. 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. Vous pouvez donc enregistrer une instance avec un ExoPlayer :

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Pour observer le journal, utilisez l'onglet Logcat d'Android Studio. Vous pouvez sélectionner votre application en tant que 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 ne consigner que cette application en sélectionnant Afficher uniquement l'application sélectionnée. Il est possible de filtrer davantage la journalisation avec l'expression EventLogger|ExoPlayerImpl, pour n'obtenir que la journalisation 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 concernant la version du lecteur, l'appareil et l'OS sur lesquels l'application s'exécute, les flags de fonctionnalité actifs et les modules d'ExoPlayer qui ont été chargés :

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]

État de lecture

Les changements d'état du lecteur sont consignés 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 et la reprend une seconde plus tard, à 10,4 secondes. La lecture se termine 10 secondes plus tard, à 20,4 secondes. Les éléments communs entre crochets sont les suivants :

  • [eventTime=float] : temps écoulé depuis la création du lecteur.
  • [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 sur les pistes 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 suivant 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 l'indique supported=NO_EXCEEDS_CAPABILITIES. Le lecteur s'adapte entre les pistes vidéo sélectionnées pendant la lecture. Lorsque le lecteur passe d'une piste à une autre, l'événement est consigné sur une ligne semblable à celle-ci :

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 640 x 360 trois secondes après le début du contenu multimédia.

Sélection du décodeur

Dans la plupart des cas, ExoPlayer affiche les contenus multimédias à l'aide d'un MediaCodec acquis à 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]