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
comprendere cosa sta facendo il giocatore, nonché per il debug della riproduzione
problemi. EventLogger implementa AnalyticsListener, quindi registrare un'istanza
con un ExoPlayer è facile:
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
Il modo più semplice per osservare il log è utilizzare la scheda Logcat di Android Studio. Puoi
selezionare la tua app come processo di 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 la registrazione con l'espressione
EventLogger|ExoPlayerImpl, per ottenere solo la registrazione da EventLogger e dal
player stesso.
Un'alternativa all'utilizzo della scheda logcat di Android Studio è la console. Per 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 e sui moduli di ExoPlayer che sono
stati caricati:
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]
Stato di riproduzione
Le modifiche dello stato del giocatore 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 le parentesi quadre sono:
[eventTime=float]: Il tempo reale trascorso dalla creazione del giocatore.[mediaPos=float]: La posizione di riproduzione corrente.[window=int]: L'indice della finestra corrente.[period=int]: il periodo corrente nella finestra.
Gli elementi finali di ogni riga indicano il valore dello stato segnalato.
Tracce multimediali
Le informazioni sulle tracce vengono registrate quando cambiano le tracce disponibili o selezionate. Ciò si verifica almeno una volta all'inizio della riproduzione. L'esempio seguente mostra la registrazione 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 giocatore 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 video player si adatterà alle tracce video selezionate durante la riproduzione. Quando
il player passa da una traccia all'altra, viene registrato in una riga come quella
di seguito:
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 640x360 tre secondi dopo l'inizio della riproduzione dei contenuti multimediali.
Selezione del decoder
Nella maggior parte dei casi, ExoPlayer esegue il rendering dei contenuti multimediali utilizzando un MediaCodec acquisito dalla piattaforma sottostante. Quando viene inizializzato un decodificatore, questo 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]