Theo mặc định, ExoPlayer chỉ ghi lại các lỗi. Để ghi lại các sự kiện của trình phát, bạn có thể sử dụng lớp EventLogger. Nhờ nhật ký bổ sung mà bạn có thể hiểu rõ hơn về những việc người chơi đang làm, cũng như gỡ lỗi các vấn đề về việc phát. EventLogger triển khai AnalyticsListener, vì vậy, việc đăng ký một thực thể bằng ExoPlayer rất dễ dàng:
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
Cách dễ nhất để quan sát nhật ký là sử dụng thẻ logcat của Android Studio. Bạn có thể chọn ứng dụng của mình làm quy trình có thể gỡ lỗi theo tên gói (androidx.media3.demo.main nếu dùng ứng dụng minh hoạ) và yêu cầu thẻ logcat chỉ ghi nhật ký cho ứng dụng đó bằng cách chọn show only selected application (chỉ hiện ứng dụng đã chọn). Bạn có thể lọc thêm nhật ký bằng biểu thức EventLogger|ExoPlayerImpl để chỉ nhận nhật ký từ EventLogger và chính trình phát.
Một giải pháp thay thế cho việc sử dụng thẻ logcat của Android Studio là sử dụng bảng điều khiển. Ví dụ:
adb logcat EventLogger:* ExoPlayerImpl:* *:s
Thông tin người chơi
Lớp ExoPlayerImpl cung cấp 2 dòng quan trọng về phiên bản trình phát, thiết bị và hệ điều hành mà ứng dụng đang chạy cũng như các mô-đun của ExoPlayer đã được tải:
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]
Trạng thái phát
Các thay đổi về trạng thái của người chơi được ghi lại trong những dòng như sau:
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]
Trong ví dụ này, quá trình phát bắt đầu 0,93 giây sau khi trình phát được chuẩn bị. Người dùng tạm dừng quá trình phát sau 9,4 giây và tiếp tục phát sau đó một giây ở 10,4 giây. Quá trình phát sẽ kết thúc sau 10 giây, tức là ở giây thứ 20,4. Các phần tử phổ biến trong dấu ngoặc vuông là:
[eventTime=float]: Thời gian đồng hồ treo tường kể từ khi người chơi được tạo.[mediaPos=float]: Vị trí phát hiện tại.[window=int]: Chỉ mục cửa sổ hiện tại.[period=int]: Khoảng thời gian hiện tại trong cửa sổ đó.
Các phần tử cuối cùng trong mỗi dòng cho biết giá trị của trạng thái đang được báo cáo.
Bản âm thanh
Thông tin về bản phụ đề được ghi lại khi bản phụ đề có sẵn hoặc được chọn thay đổi. Điều này xảy ra ít nhất một lần khi bắt đầu phát. Ví dụ bên dưới cho thấy tính năng ghi nhật ký theo dõi cho một luồng thích ứng:
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: ]
Trong ví dụ này, trình phát đã chọn 4 trong số 5 phụ đề video có sẵn. Đường tiếng thứ năm không được chọn vì vượt quá khả năng của thiết bị, như được biểu thị bằng supported=NO_EXCEEDS_CAPABILITIES.
Trình phát sẽ điều chỉnh giữa các phụ đề đã chọn trong quá trình phát. Khi trình phát chuyển đổi từ bản phụ đề này sang bản phụ đề khác, thông tin này sẽ được ghi vào một dòng như dòng bên dưới:
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]
Dòng nhật ký này cho biết trình phát đã chuyển sang bản video có độ phân giải 640x360 sau 3 giây kể từ khi bắt đầu phát nội dung nghe nhìn.
Lựa chọn bộ giải mã
Trong hầu hết các trường hợp, ExoPlayer hiển thị nội dung nghe nhìn bằng MediaCodec thu được từ nền tảng cơ bản. Khi một bộ giải mã được khởi tạo, thông tin này sẽ được ghi vào nhật ký theo các dòng như sau:
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]