Per impostazione predefinita, ExoPlayer registra solo gli errori. Per registrare gli eventi del player, è possibile utilizzare la classe EventLogger. Il logging aggiuntivo che fornisce può essere utile per capire cosa sta facendo il player, nonché per eseguire il debug dei problemi di riproduzione. EventLogger implementa AnalyticsListener, quindi puoi registrare un'istanza con un ExoPlayer:
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
Per osservare il log, utilizza la scheda logcat di Android Studio. Puoi selezionare la tua app come processo abilitato al debug in base al nome del pacchetto (androidx.media3.demo.main se utilizzi l'app demo) e indicare alla scheda logcat di registrare solo per quell'app selezionando Mostra solo l'applicazione selezionata. È possibile filtrare ulteriormente il logging con l'espressione EventLogger|ExoPlayerImpl per ottenere solo il logging da EventLogger e dal player stesso.
Un'alternativa all'utilizzo della scheda logcat di Android Studio è l'utilizzo della console. Ad esempio:
adb logcat EventLogger:* ExoPlayerImpl:* *:s
Informazioni sul giocatore
La classe ExoPlayerImpl fornisce due righe importanti sulla versione del player,
sul dispositivo e sul sistema operativo su cui è in esecuzione l'app, sui flag di funzionalità attivi e sui
moduli di ExoPlayer che sono stati caricati:
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]
Stato della riproduzione
Le modifiche allo stato del player vengono registrate in righe come queste:
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]
In questo esempio, la riproduzione inizia 0,93 secondi dopo la preparazione del player. L'utente mette in pausa la riproduzione dopo 9,4 secondi e la riprende un secondo dopo, a 10,4 secondi. La riproduzione termina dieci secondi dopo, a 20,4 secondi. Gli elementi comuni tra parentesi quadre sono:
[eventTime=float]: il tempo trascorso dalla creazione del player.[mediaPos=float]: la posizione di riproduzione corrente.[window=int]: l'indice della finestra corrente.[period=int]: il periodo corrente in quella finestra.
Gli elementi finali di ogni riga indicano il valore dello stato segnalato.
Tracce multimediali
Le informazioni sulla traccia vengono registrate quando le tracce disponibili o selezionate cambiano. Questo accade almeno una volta all'inizio della riproduzione. L'esempio seguente mostra il logging delle tracce per uno stream adattivo:
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: ]
In questo esempio, il player ha selezionato quattro delle cinque tracce video disponibili. La quinta traccia video non è selezionata perché supera le
funzionalità del dispositivo, come indicato da supported=NO_EXCEEDS_CAPABILITIES.
Il player si adatta alle tracce video selezionate durante la riproduzione. Quando il player passa da una traccia all'altra, l'evento viene registrato in una riga simile alla seguente:
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]
Questa riga di log indica che il player è passato alla traccia video con risoluzione 640 x 360 tre secondi dopo l'inizio del contenuto multimediale.
Selezione del decoder
Nella maggior parte dei casi, ExoPlayer esegue il rendering dei contenuti multimediali utilizzando un MediaCodec acquisito dalla piattaforma sottostante. Quando un decoder viene inizializzato, l'evento viene registrato in righe come queste:
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]