Registro de depuração

Por padrão, o ExoPlayer registra apenas erros. Para registrar eventos do jogador, o EventLogger pode ser usada. A geração de registros adicional que ele fornece pode ser útil para entender o que o player está fazendo e depurar a reprodução problemas. EventLogger implementa AnalyticsListener. Portanto, registrar uma instância com um ExoPlayer é fácil:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

A maneira mais fácil de observar o registro é usando a guia Logcat do Android Studio. Você pode selecionar seu aplicativo como processo depurável pelo nome do pacote ( androidx.media3.demo.main se estiver usando o app de demonstração) e informar ao Logcat. para registrar apenas esse aplicativo selecionando mostrar apenas o aplicativo selecionado. Está é possível filtrar ainda mais a geração de registros com a expressão EventLogger|ExoPlayerImpl, para acessar apenas a geração de registros de EventLogger e o player de vídeo.

Uma alternativa ao uso da guia "Logcat" do Android Studio é usar o console. Por exemplo:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Informações do jogador

A classe ExoPlayerImpl fornece duas linhas importantes sobre a versão do jogador: o dispositivo e o SO em que o app está sendo executado e os módulos do ExoPlayer que foi carregado:

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]

Estado da reprodução

As alterações de estado do player são registradas em linhas como estas:

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]

Neste exemplo, a reprodução começa 0,93 segundo após o player ser preparado. A o usuário pausa a reprodução após 9, 4 segundos e retoma a reprodução um segundo depois em 10,4 segundos. A reprodução termina 10 segundos depois, aos 20,4 segundos. As etapas elementos dentro dos colchetes são:

  • [eventTime=float]: o tempo decorrido desde a criação do jogador.
  • [mediaPos=float]: a posição de reprodução atual.
  • [window=int]: o índice da janela atual.
  • [period=int]: o período atual na janela.

Os elementos finais de cada linha indicam o valor do estado que está sendo relatado.

Faixas de mídia

As informações da faixa são registradas quando as faixas disponíveis ou selecionadas são alteradas. Isso acontece pelo menos uma vez no início da reprodução. O exemplo abaixo mostra geração de registros para um stream adaptável:

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: ]

Neste exemplo, o player selecionou quatro dos cinco vídeos disponíveis trilhas. A quinta faixa de vídeo não foi selecionada porque excede a recursos do dispositivo, conforme indicado por supported=NO_EXCEEDS_CAPABILITIES. O player se adaptará entre as faixas de vídeo selecionadas durante a reprodução. Quando o jogador se adapta de uma faixa a outra, é registrado em uma linha como a abaixo:

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]

Esta linha de registro indica que o player mudou para a resolução de vídeo de 640 x 360 acompanhar três segundos na mídia.

Seleção do decodificador

Na maioria dos casos, o ExoPlayer renderiza mídia usando um MediaCodec adquirido do plataforma subjacente. Quando um decodificador é inicializado, isso é registrado em linhas como estes:

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]