Consignation des données de débogage

Par défaut, ExoPlayer ne consigne que les erreurs. Pour enregistrer les événements du joueur, le EventLogger peut être utilisée. La journalisation supplémentaire qu'il fournit peut être utile pour pour comprendre ce que fait le lecteur et pour déboguer les problèmes de performances. EventLogger implémente AnalyticsListener, donc l'enregistrement d'une instance est effectué. avec ExoPlayer est simple:

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. Toi 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 d'indiquer à Logcat pour vous connecter uniquement à cette application en sélectionnant show only selected application (afficher uniquement l'application sélectionnée). Il est de filtrer davantage la journalisation avec l'expression EventLogger|ExoPlayerImpl, pour n'obtenir que la journalisation de EventLogger et lui-même.

Une alternative à l'onglet Logcat d'Android Studio consiste à utiliser la console. 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 le système d'exploitation sur lesquels l'application s'exécute et les modules d'ExoPlayer qui ont a été chargé:

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 lecture

Les changements d'état d'un 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. La 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 dix secondes plus tard à 20,4 secondes. Le point commun entre crochets sont les suivants:

  • [eventTime=float]: durée depuis la création du joueur
  • [mediaPos=float]: position actuelle de la lecture
  • [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 titres sont consignées lorsque les titres disponibles ou sélectionnés changent. Ce au moins une fois au début de la lecture. L'exemple ci-dessous montre un canal Logging 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 vidéos disponibles canaux. La cinquième piste vidéo n'est pas sélectionnée, car elle dépasse la de l'appareil, comme indiqué par supported=NO_EXCEEDS_CAPABILITIES. Le lecteur s'adapte entre les pistes vidéo sélectionnées pendant la lecture. Quand ? le lecteur s'adapte d'un morceau à l'autre, il est consigné dans une ligne 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é à une résolution vidéo de 640 x 360. après trois secondes de passage dans le mé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é, il est consigné dans des lignes telles que ceux-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]