Log di debug

Per impostazione predefinita, ExoPlayer registra solo gli errori. Per registrare gli eventi del player, EventLogger . Il logging aggiuntivo che fornisce può essere utile per capire cosa sta facendo il player e per eseguire il debug della riproduzione che le applicazioni presentino problemi di prestazioni. Poiché EventLogger implementa AnalyticsListener, la registrazione di un'istanza con ExoPlayer è facile:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Il modo più semplice per osservare il log è tramite la scheda Logcat di Android Studio. Tu puoi selezionare la tua app come processo di cui può essere eseguito il debug in base al nome del pacchetto ( androidx.media3.demo.main se usi l'app demo) e comunica al logcat scheda per accedere soltanto all'app selezionata, selezionando Mostra solo l'applicazione selezionata. È possibile filtrare ulteriormente il logging con l'espressione EventLogger|ExoPlayerImpl, per ottenere il logging solo da EventLogger e player.

Un'alternativa all'utilizzo della scheda logcat di Android Studio è l'utilizzo della console. Per esempio:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Informazioni sul giocatore

La classe ExoPlayerImpl fornisce due righe importanti sulla versione del player: il dispositivo e il sistema operativo su cui è in esecuzione l'app e i moduli di ExoPlayer che caricato:

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 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. La l'utente mette in pausa la riproduzione dopo 9, 4 secondi e riprende la riproduzione un secondo dopo 10,4 secondi. La riproduzione termina dieci secondi dopo a 20,4 secondi. Il comune tra parentesi quadre:

  • [eventTime=float]: le ore effettive dalla creazione del player.
  • [mediaPos=float]: la posizione di riproduzione attuale.
  • [window=int]: indice della finestra attuale.
  • [period=int]: la mestruazione corrente nella finestra temporale.

Gli elementi finali di ogni riga indicano il valore dello stato segnalato.

Tracce multimediali

Le informazioni sui brani vengono registrate quando cambiano i brani disponibili o selezionati. Questo avvenga almeno una volta all'inizio della riproduzione. L'esempio seguente mostra la traccia logging 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 dei cinque video le tracce audio. La quinta traccia video non è selezionata perché supera le capacità del dispositivo, come indicato da supported=NO_EXCEEDS_CAPABILITIES. Il player si adatta alla traccia video selezionata durante la riproduzione. Quando il player si adatta da una traccia all'altra, viene registrata in una riga come quella sotto:

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 del log indica che il player è passato al video con risoluzione 640 x 360 tre secondi di riproduzione dei contenuti multimediali.

Selezione del decodificatore

Nella maggior parte dei casi, ExoPlayer esegue il rendering dei contenuti multimediali utilizzando un valore MediaCodec acquisito dal la piattaforma sottostante. Quando un decoder viene inizializzato, viene registrato in righe come questi:

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]