Ghi nhật ký gỡ lỗi

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

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à cho logcat biết để 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ây giờ để lọc thêm việc ghi 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 đó.

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ó đã đượ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 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 sau khi trình phát chuẩn bị xong. Chiến lược phát hành đĩa đơn người dùng tạm dừng phát sau 9, 4 giây và tiếp tục phát lại một giây sau đó vào 10,4 giây. Quá trình phát sẽ kết thúc sau 10 giây ở thời điểm 20,4 giây. Thông tin chung các phần tử trong dấu ngoặc vuông là:

  • [eventTime=float]: Thời gian đồ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 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 nghe nhìn

Thông tin bản nhạc được ghi lại khi các bản nhạc hiện có hoặc đã chọn thay đổi. Chiến dịch này xảy ra ít nhất một lần khi bắt đầu phát. Ví dụ bên dưới thể hiện bản nhạc ghi nhật ký 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, trình phát đã chọn bốn trong số năm video có sẵn bản nhạc. Bản video thứ năm không được chọn vì vượt quá khả năng của thiết bị, được biểu thị bằng supported=NO_EXCEEDS_CAPABILITIES. Trình phát sẽ điều chỉnh giữa các bản video đã chọn trong khi phát. Thời gian người chơi thích ứng từ bản nhạc này sang bản nhạc khác, nó sẽ được ghi lại trong một dòng giố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 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.

Lựa 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 đa phương tiện bằng cách sử dụng MediaCodec có được từ nền tảng cơ bản. Khi bộ giải mã được khởi tạo, tác vụ 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]