디버그 로깅

기본적으로 ExoPlayer는 오류만 로깅합니다. 플레이어 이벤트를 로깅하려면 EventLogger 클래스를 사용하면 됩니다. 제공되는 추가 로깅은 플레이어의 작업을 이해하고 재생 문제를 디버깅하는 데 도움이 될 수 있습니다. EventLoggerAnalyticsListener를 구현하므로 ExoPlayer를 사용하여 인스턴스를 쉽게 등록할 수 있습니다.

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

로그를 관찰하는 가장 쉬운 방법은 Android 스튜디오의 logcat 탭을 사용하는 것입니다. 패키지 이름(데모 앱을 사용하는 경우 androidx.media3.demo.main)으로 앱을 디버그 가능한 프로세스로 선택하고 Show only selected application을 선택하여 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]