根據預設,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 秒後繼續播放。播放時間在 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 個視訊軌超過裝置功能 (如 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]