การบันทึกการแก้ไขข้อบกพร่อง
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
โดยค่าเริ่มต้น ExoPlayer จะบันทึกเฉพาะข้อผิดพลาดเท่านั้น ในการบันทึกเหตุการณ์ของโปรแกรมเล่น EventLogger
เท่านั้น การบันทึกเพิ่มเติมที่มีให้อาจมีประโยชน์สำหรับ
การทำความเข้าใจสิ่งที่โปรแกรมเล่นกำลังทำอยู่ รวมถึงการแก้ไขข้อบกพร่องในการเล่น
ปัญหา EventLogger
จะใช้ AnalyticsListener
ดังนั้นการลงทะเบียนอินสแตนซ์
ด้วย ExoPlayer
นั้นง่ายนิดเดียว:
Kotlin
player.addAnalyticsListener(EventLogger())
Java
player.addAnalyticsListener(new EventLogger());
วิธีที่ง่ายที่สุดในการสังเกตบันทึกคือการใช้แท็บ Logcat ของ Android Studio คุณ
เลือกแอปของคุณเป็นกระบวนการแก้ไขข้อบกพร่องได้ด้วยชื่อแพ็กเกจ (
androidx.media3.demo.main
หากใช้แอปเดโม) และบอก Logcat
เพื่อบันทึกเฉพาะแอปนั้นๆ โดยเลือกแสดงเฉพาะแอปพลิเคชันที่เลือก ตอนนี้
เพื่อกรองการบันทึกที่มีนิพจน์
EventLogger|ExoPlayerImpl
เพื่อรับเฉพาะการบันทึกจาก EventLogger
และ
ของโปรแกรมเล่นนั้นเอง
อีกทางเลือกหนึ่งนอกเหนือจากการใช้แท็บ Logcat ของ Android Studio คือการใช้คอนโซล สำหรับ
ตัวอย่าง:
adb logcat EventLogger:* ExoPlayerImpl:* *:s
คลาส ExoPlayerImpl
มีข้อมูลสำคัญ 2 บรรทัดเกี่ยวกับเวอร์ชันโปรแกรมเล่น
อุปกรณ์และระบบปฏิบัติการที่แอปกําลังทํางานอยู่ และโมดูลของ ExoPlayer ที่
โหลดแล้ว:
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]
สถานะการเล่น
การเปลี่ยนแปลงสถานะของโปรแกรมเล่นจะถูกบันทึกไว้ในบรรทัดต่างๆ ดังนี้:
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]
ในตัวอย่างนี้ การเล่นจะเริ่มต้น 0.93 วินาทีหลังจากเตรียมโปรแกรมเล่นเสร็จ
ผู้ใช้หยุดเล่นชั่วคราวหลังจาก 9.4 วินาที และกลับมาเล่นต่อใน 1 วินาทีหลังจากนั้น
10.4 วินาที การเล่นจะสิ้นสุดใน 10 วินาทีที่เวลา 20.4 วินาที ทั่วไป
องค์ประกอบภายในวงเล็บเหลี่ยมได้แก่
[eventTime=float]
: เวลานับจากสร้างผู้เล่น
[mediaPos=float]
: ตำแหน่งการเล่นปัจจุบัน
[window=int]
: ดัชนีหน้าต่างปัจจุบัน
[period=int]
: ระยะเวลาปัจจุบันในหน้าต่างนั้น
องค์ประกอบสุดท้ายในแต่ละบรรทัดจะระบุค่าของรัฐที่รายงาน
ระบบจะบันทึกข้อมูลแทร็กเมื่อแทร็กที่พร้อมใช้งานหรือแทร็กที่เลือกมีการเปลี่ยนแปลง ช่วงเวลานี้
จะเกิดขึ้นอย่างน้อย 1 ครั้งเมื่อเริ่มเล่น ตัวอย่างด้านล่างแสดงแทร็ก
บันทึกสำหรับสตรีมแบบปรับอัตโนมัติ
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: ]
ในตัวอย่างนี้ โปรแกรมเล่นได้เลือกวิดีโอที่มีอยู่ 4 จาก 5 รายการ
ไม่ได้เลือกแทร็กวิดีโอที่ห้าเนื่องจากเกิน
ความสามารถของอุปกรณ์ ตามที่ระบุโดย supported=NO_EXCEEDS_CAPABILITIES
ระหว่างการเล่น ระบบจะปรับเปลี่ยนโปรแกรมเล่นวิดีโอระหว่างแทร็กวิดีโอที่เลือกไว้ วันและเวลา
โปรแกรมเล่นจะปรับตัวจากแทร็กหนึ่งไปยังอีกแทร็กหนึ่ง โดยจะแสดงเป็นบรรทัดเดียวกับแทร็ก
ด้านล่าง
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]
บรรทัดบันทึกนี้ระบุว่าโปรแกรมเล่นเปลี่ยนไปใช้วิดีโอความละเอียด 640x360
ติดตามสื่อเป็นเวลา 3 วินาที
การเลือกเครื่องมือถอดรหัส
ในกรณีส่วนใหญ่ ExoPlayer จะแสดงผลสื่อโดยใช้ MediaCodec
ที่ได้มาจาก
แพลตฟอร์มพื้นฐาน เมื่อเริ่มต้นตัวถอดรหัส จะมีการลงชื่อเข้าใช้บรรทัดต่างๆ เช่น
ดังนี้
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]
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[null,null,["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# Debug logging\n\nBy default, ExoPlayer only logs errors. To log player events, the `EventLogger`\nclass can be used. The additional logging it provides can be helpful for\nunderstanding what the player is doing, as well as for debugging playback\nissues. `EventLogger` implements `AnalyticsListener`, so registering an instance\nwith an `ExoPlayer` is easy: \n\n### Kotlin\n\n```kotlin\nplayer.addAnalyticsListener(EventLogger())\n```\n\n### Java\n\n```java\nplayer.addAnalyticsListener(new EventLogger());\n```\n\n\u003cbr /\u003e\n\nThe easiest way to observe the log is using Android Studio's [logcat tab](/studio/debug/am-logcat). You\ncan select your app as debuggable process by the package name (\n`androidx.media3.demo.main` if using the demo app) and tell the logcat\ntab to log only for that app by selecting **show only selected application** . It's\npossible to further filter the logging with the expression\n`EventLogger|ExoPlayerImpl`, to get only logging from `EventLogger` and the\nplayer itself.\n\nAn alternative to using Android Studio's logcat tab is to use the console. For\nexample: \n\n adb logcat EventLogger:* ExoPlayerImpl:* *:s\n\n### Player information\n\nThe `ExoPlayerImpl` class delivers two important lines about the player version,\nthe device and OS the app is running on and the modules of ExoPlayer that have\nbeen loaded: \n\n ExoPlayerImpl: Init 59a18ab [AndroidXMedia3/1.0.0-rc02] [flame, Pixel 4, Google, 33]\n 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]\n\n### Playback state\n\nPlayer state changes are logged in lines like these: \n\n EventLogger: playWhenReady [eventTime=0.00, mediaPos=0.00, window=0, true, USER_REQUEST]\n EventLogger: state [eventTime=0.01, mediaPos=0.00, window=0, BUFFERING]\n EventLogger: state [eventTime=0.93, mediaPos=0.00, window=0, period=0, READY]\n EventLogger: isPlaying [eventTime=0.93, mediaPos=0.00, window=0, period=0, true]\n EventLogger: playWhenReady [eventTime=9.40, mediaPos=8.40, window=0, period=0, false, USER_REQUEST]\n EventLogger: isPlaying [eventTime=9.40, mediaPos=8.40, window=0, period=0, false]\n EventLogger: playWhenReady [eventTime=10.40, mediaPos=8.40, window=0, period=0, true, USER_REQUEST]\n EventLogger: isPlaying [eventTime=10.40, mediaPos=8.40, window=0, period=0, true]\n EventLogger: state [eventTime=20.40, mediaPos=18.40, window=0, period=0, ENDED]\n EventLogger: isPlaying [eventTime=20.40, mediaPos=18.40, window=0, period=0, false]\n\nIn this example playback starts 0.93 seconds after the player is prepared. The\nuser pauses playback after 9.4 seconds, and resumes playback one second later at\n10.4 seconds. Playback ends ten seconds later at 20.4 seconds. The common\nelements within the square brackets are:\n\n- `[eventTime=float]`: The wall clock time since player creation.\n- `[mediaPos=float]`: The current playback position.\n- `[window=int]`: The current window index.\n- `[period=int]`: The current period in that window.\n\nThe final elements in each line indicate the value of the state being reported.\n\n### Media tracks\n\nTrack information is logged when the available or selected tracks change. This\nhappens at least once at the start of playback. The example below shows track\nlogging for an adaptive stream: \n\n EventLogger: tracks [eventTime=0.30, mediaPos=0.00, window=0, period=0,\n EventLogger: group [\n EventLogger: [X] Track:0, id=133, mimeType=video/avc, bitrate=261112, codecs=avc1.4d4015, res=426x240, fps=30.0, supported=YES\n EventLogger: [X] Track:1, id=134, mimeType=video/avc, bitrate=671331, codecs=avc1.4d401e, res=640x360, fps=30.0, supported=YES\n EventLogger: [X] Track:2, id=135, mimeType=video/avc, bitrate=1204535, codecs=avc1.4d401f, res=854x480, fps=30.0, supported=YES\n EventLogger: [X] Track:3, id=160, mimeType=video/avc, bitrate=112329, codecs=avc1.4d400c, res=256x144, fps=30.0, supported=YES\n EventLogger: [ ] Track:4, id=136, mimeType=video/avc, bitrate=2400538, codecs=avc1.4d401f, res=1280x720, fps=30.0, supported=NO_EXCEEDS_CAPABILITIES\n EventLogger: ]\n EventLogger: group [\n EventLogger: [ ] Track:0, id=139, mimeType=audio/mp4a-latm, bitrate=48582, codecs=mp4a.40.5, channels=2, sample_rate=22050, supported=YES\n EventLogger: [X] Track:1, id=140, mimeType=audio/mp4a-latm, bitrate=127868, codecs=mp4a.40.2, channels=2, sample_rate=44100, supported=YES\n EventLogger: ]\n EventLogger: ]\n\nIn this example, the player has selected four of the five available video\ntracks. The fifth video track is not selected because it exceeds the\ncapabilities of the device, as indicated by `supported=NO_EXCEEDS_CAPABILITIES`.\nThe player will adapt between the selected video tracks during playback. When\nthe player adapts from one track to another, it's logged in a line like the one\nbelow: \n\n 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]\n\nThis log line indicates that the player switched to the 640x360 resolution video\ntrack three seconds into the media.\n\n### Decoder selection\n\nIn most cases, ExoPlayer renders media using a `MediaCodec` acquired from the\nunderlying platform. When a decoder is initialized, this is logged in lines like\nthese: \n\n EventLogger: videoDecoderInitialized [0.77, 0.00, window=0, period=0, video, OMX.qcom.video.decoder.avc]\n EventLogger: audioDecoderInitialized [0.79, 0.00, window=0, period=0, audio, OMX.google.aac.decoder]"]]