Ghi nhật ký gỡ lỗi

Theo mặc định, ExoPlayer chỉ ghi lại lỗi. Để ghi lại các sự kiện của người chơi, bạn có thể sử dụng lớp EventLogger. Tính năng ghi nhật ký bổ sung mà trình phát này cung cấp có thể hữu ích để hiểu rõ những gì trình phát đang thực hiện, cũng như để gỡ lỗi các vấn đề phát. EventLogger triển khai AnalyticsListener, vì vậy, bạn có thể dễ dàng đăng ký một thực thể bằng ExoPlayer:

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 làm quy trình có thể gỡ lỗi theo tên gói (androidx.media3.demo.main nếu sử 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 hoạt động ghi nhật ký bằng biểu thức EventLogger|ExoPlayerImpl để chỉ nhận được hoạt động ghi 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 về trình phát

Lớp ExoPlayerImpl cung cấp hai 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 người chơi được ghi lại trong các 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 phát sau 9,4 giây và tiếp tục phát sau 10,4 giây một giây. Quá trình phát kết thúc 10 giây sau đó tại 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 theo đồng hồ kể từ khi tạo người chơi.
  • [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 nội dung nghe nhìn

Thông tin về bản nhạc được ghi lại khi các bản nhạc có sẵn hoặc đã chọn thay đổi. Việc này xảy ra ít nhất một lần khi bắt đầu phát. Ví dụ dưới đây cho thấy tính năng ghi nhật ký theo dõi cho 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, người chơi đã chọn 4 trong số 5 kênh video có sẵn. Không chọn kênh video thứ năm vì kênh này vượt quá khả năng của thiết bị, như được chỉ báo bằng supported=NO_EXCEEDS_CAPABILITIES. Trình phát sẽ điều chỉnh giữa các kênh video đã chọn trong khi phát. Khi trình phát điều chỉnh từ một bản nhạc sang một bản nhạc khác, sự kiện này sẽ được ghi lại trong 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 kênh video có độ phân giải 640x360 sau 3 giây 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 đa phương tiện bằng cách sử dụng MediaCodec thu được từ nền tảng cơ sở. Khi khởi động bộ giải mã, mã này sẽ được ghi lại trong 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]