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, bạn có thể sử dụng lớp EventLogger. Tính năng ghi nhật ký bổ sung mà trình nghe này cung cấp có thể giúp bạn hiểu được hoạt động của trình phát, cũng như gỡ lỗi các vấn đề về phát. EventLogger triển khai AnalyticsListener, vì vậy, bạn có thể đăng ký một thực thể bằng ExoPlayer:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

Để xem nhật ký, hãy 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 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 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 cách khá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ề người chơi

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ờ tính năng đang hoạt động và các mô-đun của ExoPlayer đã được tải:

ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33] [Canary:ON]
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 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 bắt đầu sau 0,93 giây kể từ 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 đó một giây, tức là ở giây thứ 10,4. Quá trình phát 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 thực tế kể từ khi tạo trình phát.
  • [mediaPos=float]: Vị trí phát hiện tại.
  • [window=int]: Chỉ mục cửa sổ hiện tại.
  • [period=int]: Giai đoạn 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 được báo cáo.

Bản âm thanh/video

Thông tin về bản nhạc được ghi lại khi các bản nhạc 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ụ sau đây cho thấy việc 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 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 chỉ định bởi 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. Khi trình phát chuyển từ bản nhạc này sang bản nhạc khác, sự kiện này sẽ được ghi lại trong một dòng như sau:

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 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 kết xuất nội dung nghe nhìn bằng MediaCodec lấy từ nền tảng cơ bản. Khi một bộ giải mã được khởi chạy, thông tin 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]