偵錯記錄功能

根據預設,ExoPlayer 只會記錄錯誤。如要記錄播放器事件,可以使用 EventLogger 類別。這項功能提供的額外記錄有助於瞭解播放器的運作方式,以及偵錯播放問題。EventLogger 會實作 AnalyticsListener,因此使用 ExoPlayer 註冊例項非常簡單:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

如要觀察記錄,最簡單的方法是使用 Android Studio 的 logcat 分頁標籤。您可以依套件名稱 (androidx.media3.demo.main,如果使用示範應用程式) 選取應用程式做為可偵錯的程序,然後選取「僅顯示所選應用程式」,讓 logcat 分頁只記錄該應用程式的資訊。您可以使用 EventLogger|ExoPlayerImpl 表達式進一步篩選記錄,只取得 EventLogger 和播放器本身的記錄。

除了使用 Android Studio 的 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 秒後暫停播放,並在一秒後於 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: ]

在本例中,播放器已選取五個可用視訊軌中的四個。第五個影片軌未選取,因為超出裝置功能限制,如 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]

這行記錄表示播放器在媒體播放三秒後,切換至 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]