Par défaut, ExoPlayer ne journalise 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 et pour déboguer les problèmes de lecture. EventLogger
implémente AnalyticsListener
. Il est donc facile d'enregistrer une instance avec 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 en fonction du nom du package (androidx.media3.demo.main
si vous utilisez l'application de démonstration) et demander à l'onglet Logcat de ne consigner que les journaux de 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.
Vous pouvez 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, et les modules d'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 lecture
Les changements d'état du joueur 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 au bout de 9,4 secondes et la reprend une seconde plus tard, à 10,4 secondes. La lecture se termine dix secondes plus tard, à 20,4 secondes. Les éléments communs entre crochets sont les suivants:
[eventTime=float]
: durée 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 de cette période.
Les éléments finaux de chaque ligne indiquent la valeur de l'état signalé.
Pistes multimédias
Les informations sur les canaux sont enregistrées lorsque les canaux disponibles ou sélectionnés 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. Le cinquième canal vidéo n'est pas sélectionné, car il dépasse les capacités 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. Lorsque le lecteur passe d'un titre à un autre, il est consigné dans une ligne semblable à 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 en 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 effectue le rendu des contenus multimédias à l'aide d'un MediaCodec
acquis auprès de la plate-forme sous-jacente. Lorsqu'un décodeur est initialisé, il 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]