디버그 로깅

기본적으로 ExoPlayer는 오류만 로깅합니다. 플레이어 이벤트를 기록하려면 EventLogger 클래스를 사용할 수 있습니다. 이 옵션에서 제공하는 추가 로깅은 플레이어가 실행 중인 작업을 파악하고 재생 문제를 디버그하는 데 도움이 될 수 있습니다. EventLoggerAnalyticsListener를 구현하므로 ExoPlayer로 인스턴스를 등록하는 것은 쉽습니다.

Kotlin

player.addAnalyticsListener(EventLogger())

자바

player.addAnalyticsListener(new EventLogger());

로그를 관찰하는 가장 쉬운 방법은 Android 스튜디오의 logcat 탭을 사용하는 것입니다. 패키지 이름(데모 앱을 사용하는 경우 androidx.media3.demo.main)으로 앱을 디버그 가능한 프로세스로 선택하고 선택한 애플리케이션만 표시를 선택하여 Logcat 탭에 해당 앱에 대해서만 로깅하도록 지시할 수 있습니다. EventLogger|ExoPlayerImpl 표현식을 사용하여 로깅을 추가로 필터링하여 EventLogger 및 플레이어 자체의 로깅만 가져올 수 있습니다.

Android 스튜디오의 Logcat 탭을 사용하는 대신 콘솔을 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

adb logcat EventLogger:* ExoPlayerImpl:* *:s

플레이어 정보

ExoPlayerImpl 클래스는 플레이어 버전, 앱이 실행 중인 기기 및 OS, 로드된 ExoPlayer 모듈에 관한 두 가지 중요한 선을 제공합니다.

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]

재생 상태

플레이어 상태 변경사항은 다음과 같은 줄에 로깅됩니다.

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]

이 예에서는 플레이어가 준비된 후 0.93초 후에 재생이 시작됩니다. 사용자가 9.4초 후에 재생을 일시중지하고 1초 후 10.4초에 재생을 재개합니다. 10초 후 20.4초에 재생이 종료됩니다. 대괄호 내의 일반적인 요소는 다음과 같습니다.

  • [eventTime=float]: 플레이어 생성 이후 경과된 실제 시간입니다.
  • [mediaPos=float]: 현재 재생 위치입니다.
  • [window=int]: 현재 창 색인입니다.
  • [period=int]: 해당 기간의 현재 기간입니다.

각 줄의 마지막 요소는 보고되는 상태의 값을 나타냅니다.

미디어 트랙

사용 가능한 트랙 또는 선택한 트랙이 변경되면 트랙 정보가 기록됩니다. 재생 시작 시 한 번 이상 발생합니다. 아래 예는 적응형 스트림의 트랙 로깅을 보여줍니다.

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

이 예시에서는 플레이어가 사용 가능한 동영상 트랙 5개 중 4개를 선택했습니다. 다섯 번째 동영상 트랙은 supported=NO_EXCEEDS_CAPABILITIES로 표시된 대로 기기의 기능을 초과하므로 선택되지 않습니다. 재생 중에 플레이어가 선택한 동영상 트랙 간에 전환합니다. 플레이어가 한 트랙에서 다른 트랙으로 조정되면 아래와 같은 줄에 로깅됩니다.

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]

이 로그 줄은 플레이어가 미디어 3초 후에 640x360 해상도 동영상 트랙으로 전환했음을 나타냅니다.

디코더 선택

대부분의 경우 ExoPlayer는 기본 플랫폼에서 획득한 MediaCodec를 사용하여 미디어를 렌더링합니다. 디코더가 초기화되면 다음과 같은 행으로 로깅됩니다.

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]