Log di debug

Per impostazione predefinita, ExoPlayer registra solo gli errori. Per registrare gli eventi del player, è possibile utilizzare la classe EventLogger. La registrazione aggiuntiva fornita può essere utile per comprendere cosa sta facendo il player e per eseguire il debug dei problemi di riproduzione. EventLogger implementa AnalyticsListener, quindi è facile registrare un'istanza con un ExoPlayer:

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 di 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 i log di EventLogger e del player stesso.

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, 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 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]: l'ora del quadrante dalla creazione del player.
  • [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 registrato.

Tracce multimediali

Le informazioni sui brani vengono registrate quando cambiano i brani disponibili o selezionati. Questo accade almeno una volta all'inizio della riproduzione. L'esempio seguente mostra il logging dei canali 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 alla traccia video selezionata durante la riproduzione. Quando il player passa da una traccia all'altra, viene registrato in una riga come quella riportata 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 del log indica che il player è passato alla traccia video con risoluzione 640 x 360 3 secondi nel contenuto multimediale.

Selezione del decodificatore

Nella maggior parte dei casi, ExoPlayer esegue il rendering dei contenuti multimediali utilizzando un MediaCodec acquisito dalla piattaforma di base. Quando un decodificatore viene inizializzato, 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]