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

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