ניפוי באגים ביומן

כברירת מחדל, ExoPlayer מתעד רק שגיאות ביומן. כדי לתעד אירועים של נגן, אפשר להשתמש במחלקה EventLogger PlayerEventLogger. הרישום הנוסף ביומן שמתקבל יכול לעזור להבין מה השחקן עושה, וגם לנפות באגים בבעיות בהפעלת התוכן. ‫EventLogger implements AnalyticsListener, כך שאפשר לרשום מופע עם ExoPlayer:

Kotlin

player.addAnalyticsListener(EventLogger())

Java

player.addAnalyticsListener(new EventLogger());

הדרך הקלה ביותר לעיין ביומן היא באמצעות הכרטיסייה logcat ב-Android Studio. אפשר לבחור את האפליקציה כתהליך שאפשר לבצע בו ניפוי באגים לפי שם החבילה (androidx.media3.demo.main אם משתמשים באפליקציית ההדגמה), ולבחור באפשרות show only selected application בכרטיסייה logcat כדי להגדיר שהיומן יתעד רק את האפליקציה הזו. אפשר לסנן עוד יותר את הרישום ביומן באמצעות הביטוי EventLogger|ExoPlayerImpl, כדי לקבל רק רישום ביומן מ-EventLogger ומנגן המדיה עצמו.

אפשר להשתמש במסוף במקום בכרטיסייה logcat ב-Android Studio. לדוגמה:

adb logcat EventLogger:* ExoPlayerImpl:* *:s

פרטי השחקן

המחלקות ExoPlayerImpl מספקות שתי שורות חשובות לגבי גרסת הנגן, המכשיר ומערכת ההפעלה שבהם האפליקציה פועלת והמודולים של 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 שניות, וממשיך את ההפעלה שנייה אחת לאחר מכן, אחרי 10.4 שניות. ההפעלה מסתיימת עשר שניות מאוחר יותר, בשנייה 20.4. האלמנטים הנפוצים בתוך הסוגריים המרובעים הם:

  • [eventTime=float]: הזמן שעבר מאז יצירת השחקן.
  • [mediaPos=float]: מיקום ההפעלה הנוכחי.
  • [window=int]: האינדקס הנוכחי של החלון.
  • [period=int]: התקופה הנוכחית בחלון הזה.

האלמנטים האחרונים בכל שורה מציינים את ערך המצב שמדווח.

טראקים של מדיה

פרטי המעקב מתועדים כשהרצועות הזמינות או הנבחרות משתנות. הפעולה הזו מתבצעת לפחות פעם אחת בתחילת ההפעלה. בדוגמה הבאה מוצג רישום ביומן של רצועות להזרמה אדפטיבית:

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: ]

בדוגמה הזו, הנגן בחר ארבעה מתוך חמשת טראקים הווידאו הזמינים. מסלול הסרטון החמישי לא נבחר כי הוא חורג מהיכולות של המכשיר, כפי שמצוין ב-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 של סרטון במהלך שלוש שניות של המדיה.

בחירת מפענח

ברוב המקרים, 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]