디버그 로깅

기본적으로 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]