Registro de depuración

De forma predeterminada, ExoPlayer solo registra errores. Para registrar eventos del reproductor, se puede usar el EventLogger " una clase". Los registros adicionales que proporciona pueden ser útiles comprender lo que está haciendo el reproductor y depurar la reproducción problemas. EventLogger implementa AnalyticsListener, por lo que registra una instancia con un ExoPlayer es fácil:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

La forma más fácil de observar el registro es mediante la pestaña logcat de Android Studio. Tú puedes seleccionar tu app como proceso depurable por el nombre del paquete ( androidx.media3.demo.main si usas la app de demo) y luego indícale a logcat. para registrar solo la aplicación seleccionada. Para ello, selecciona mostrar solo la aplicación seleccionada. Es posible filtrar aún más el registro con la expresión EventLogger|ExoPlayerImpl, para obtener solo los registros de EventLogger y el el mismo jugador.

Una alternativa al uso de la pestaña Logcat de Android Studio es usar la consola. Por ejemplo:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

Información del jugador

La clase ExoPlayerImpl proporciona dos líneas importantes sobre la versión del reproductor: el dispositivo y el SO en los que se ejecuta la app, y los módulos de ExoPlayer que tienen carga:

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 de reproducción

Los cambios en el estado del reproductor se registran en líneas 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]

En este ejemplo, la reproducción comienza 0.93 segundos después de que se prepara el reproductor. El el usuario pausa la reproducción después de 9.4 segundos y la reanuda un segundo después a las 10.4 segundos. La reproducción finaliza diez segundos después a los 20.4 segundos. La actividad elementos dentro de corchetes son:

  • [eventTime=float]: Muestra el tiempo real transcurrido desde la creación del jugador.
  • [mediaPos=float]: Es la posición de reproducción actual.
  • [window=int]: Es el índice de la ventana actual.
  • [period=int]: Es el período actual de esa ventana.

Los elementos finales de cada línea indican el valor del estado que se informa.

Pistas de contenido multimedia

La información de la pista se registra cuando cambian los segmentos disponibles o seleccionados. Esta tenga lugar al menos una vez al inicio de la reproducción. En el siguiente ejemplo, se muestran pistas registro para una transmisión adaptable:

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

En este ejemplo, el reproductor seleccionó cuatro de los cinco videos disponibles pistas. La quinta pista de video no se seleccionó porque supera el capacidades del dispositivo, como lo indica supported=NO_EXCEEDS_CAPABILITIES. El reproductor se adaptará entre las pistas de video seleccionadas durante la reproducción. Cuándo el jugador se adapta de una pista a otra, se registra en una línea como la que a continuación:

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 línea de registro indica que el reproductor cambió a la resolución de 640x360 un seguimiento de tres segundos de reproducción en los medios.

Selección del decodificador

En la mayoría de los casos, ExoPlayer procesa contenido multimedia con un MediaCodec adquirido del plataforma subyacente. Cuando se inicializa un decodificador, esto se registra en líneas como estos:

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]