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à API này cung cấp có thể giúp ích cho việc hiểu được hoạt động của người chơi, cũng như gỡ lỗi các vấn đề về việc phát. EventLogger triển khai AnalyticsListener, vì vậy, bạn có thể dễ dàng đăng ký một thực thể với 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 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 chỉ hiển thị ứ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ỉ lấy 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, đó là thiết bị và hệ điều hành mà ứng dụng đang chạy và 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

Thay đổi trạng thái trình phát đượ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 sẽ bắt đầu sau 0,93 giây kể từ khi trình phát 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 một giây sau đó ở 10,4 giây. Quá trình phát sẽ kết thúc sau 10 giây tại 20,4 giây. Các phần tử phổ biến trong dấu ngoặc vuông là:

  • [eventTime=float]: Đồng hồ treo tường 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 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 nhạc nội dung đa phương tiện

Thông tin bản nhạc được ghi lại khi các bản nhạc có sẵn hoặc đã chọn thay đổi. Quá trình 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 bản nhạc video có sẵn. Bản video thứ năm không được chọn vì vượt quá khả năng của thiết bị, như được supported=NO_EXCEEDS_CAPABILITIES biểu thị. Trình phát sẽ tự điều chỉnh giữa các bản video đã chọn trong quá trình phát. Khi người chơi chuyển từ kênh này sang kênh khác, hệ thống sẽ ghi lại vào một dòng như 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 rằng trình phát đã chuyển sang video có độ phân giải 640x360, theo dõi 3 giây trong nội dung nghe nhìn.

Chọn bộ giải mã

Trong hầu hết các trường hợp, ExoPlayer kết xuất nội dung nghe nhìn bằng cách sử dụng MediaCodec thu thập được từ nền tảng cơ sở. Khi bộ giải mã được khởi chạy, quá trình 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]