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]