Consignation des données de débogage

Par défaut, ExoPlayer ne consigne que les erreurs. Pour consigner les événements du joueur, vous pouvez utiliser la classe EventLogger. La journalisation supplémentaire fournie peut être utile pour comprendre ce que fait le lecteur et pour déboguer les problèmes de lecture. EventLogger implémente AnalyticsListener. Il est donc facile d'enregistrer 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 à l'aide du nom du package (androidx.media3.demo.main si vous utilisez l'application de démonstration) et indiquer à l'onglet logcat de consigner uniquement 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 joueur lui-même.

Plutôt que d'utiliser l'onglet Logcat d'Android Studio, vous pouvez utiliser la console. Par 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, ainsi que les modules d'ExoPlayer 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 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 démarre 0,93 seconde après la préparation du lecteur. L'utilisateur met la lecture en pause au bout de 9,4 secondes, puis la reprend une seconde plus tard, au bout de 10,4 secondes. La lecture se termine dix secondes plus tard au bout de 20,4 secondes. Les éléments communs entre crochets sont les suivants:

  • [eventTime=float]: durée d'exécution depuis la création du joueur.
  • [mediaPos=float]: position de lecture actuelle.
  • [window=int]: index de la fenêtre actuelle.
  • [period=int]: période actuelle dans cette période.

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

Pistes multimédias

Les informations relatives aux titres sont enregistrées lorsque les titres disponibles ou sélectionnés changent. Cela se produit au moins une fois au début de la lecture. L'exemple ci-dessous illustre 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'adapte aux pistes vidéo sélectionnées lors de la lecture. Lorsque le lecteur s'adapte d'une piste à une autre, il est enregistré dans une ligne semblable à celle indiquée 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 640 x 360 pendant trois secondes dans le contenu multimédia.

Sélection du décodeur

Dans la plupart des cas, ExoPlayer affiche le contenu multimédia à l'aide d'un MediaCodec acquis à partir de la plate-forme sous-jacente. Lorsqu'un décodeur est initialisé, les événements sont consignés 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]