בדף הזה נסביר איך ליצור DefaultPreloadManager, שמעמיס מראש תוכן מדיה לאפליקציה על סמך האסטרטגיה שתבחרו.
מנהלי טעינה מראש שמבוססים על המחלקה המופשטת BasePreloadManager מאפשרים לדרג את התוכן לפי הקריטריונים שתבחרו. במסמך הזה מוסבר איך להשתמש במחלקת הנגזרת DefaultPreloadManager, שבה כל פריט מדיה מדורג באמצעות מספר שלם שמייצג את המיקום שלו ברשימה (לדוגמה, המיקום שלו בקרוסלת סרטונים). מנהל הטעינה מראש מתעדף את טעינת הפריטים לפי מידת הקרבה שלהם לפריט שהמשתמש מפעיל כרגע. כך, אם משתמש עובר לפריט אחר, הפריט החדש יכול להתחיל לפעול מיד.
תהליך היצירה של מופע של DefaultPreloadManager כולל שלושה שלבים:
- מגדירים
TargetPreloadStatusControlשאפשר להשתמש בו במנהל הטעינה מראש כדי לברר אם פריט המדיה מוכן לטעינה וכמה לטעון. - יוצרים את ה-builder שבו תשתמשו כדי ליצור את מנהל הטעינה מראש, וכדי ליצור את אובייקטי
ExoPlayerשל האפליקציה. - משתמשים בכלי ליצירה כדי ליצור את הכלי לניהול טעינה מראש על ידי קריאה ל-method
build()של הכלי ליצירה.
יצירת אמצעי בקרה של סטטוס הטעינה מראש של יעד
כשיוצרים את DefaultPreloadManager.Builder, מעבירים לו אובייקט target preload status control שמוגדר על ידיכם. האובייקט הזה מטמיע את הממשק TargetPreloadStatusControl. כשהכלי לניהול טעינה מראש מתכונן לטעון מראש מדיה, הוא קורא לשיטה getTargetPreloadStatus() של אמצעי הבקרה של הסטטוס כדי לקבוע אם להכין, לטעון או לשמור במטמון תוכן של פריט מדיה. טעינה מראש של נתוני מדיה ישירות למאגר הזמני בזיכרון של נגן, כדי שהם יהיו מוכנים להפעלה מיידית, בעוד שהשמירה במטמון שומרת את נתוני המדיה במטמון הדיסק קבוע כדי לחסוך בזיכרון של הנגן. התגובה של אמצעי הבקרה של הסטטוס יכולה להיות אחת מקודי הסטטוס הבאים:
-
STAGE_SPECIFIED_RANGE_LOADED: מנהל הטעינה מראש צריך לטעון את התוכן ממיקום ההתחלה שצוין למשך הזמן שצוין (באלפיות השנייה) אל מאגר הנתונים הזמני בזיכרון של נגן המדיה. -
STAGE_SPECIFIED_RANGE_CACHED: מנהל הטעינה מראש צריך לשמור במטמון בדיסק את התוכן ממיקום ההתחלה שצוין למשך הזמן שצוין (באלפיות השנייה). -
STAGE_TRACKS_SELECTED: מנהל הטעינה מראש צריך לטעון ולעבד את המידע של רצועת התוכן ולבחור את הרצועות. מנהל הטעינה מראש לא אמור להתחיל לטעון את התוכן עדיין. -
STAGE_SOURCE_PREPARED: מנהל הטעינה מראש צריך להכין את מקור התוכן. לדוגמה, אם המטא-נתונים של התוכן נמצאים בקובץ מניפסט נפרד, יכול להיות שמנהל הטעינה מראש יאחזר וינתח את המניפסט הזה. -
null: מנהל הטעינה מראש לא צריך לטעון תוכן או מטא-נתונים עבור פריט המדיה הזה.
תצטרכו לגבש אסטרטגיה להחלטה כמה תוכן לטעון לכל פריט מדיה. בדוגמה הזו, נטען יותר תוכן לפריטים שהכי קרובים לפריט שמופעל כרגע. אם המשתמש מפעיל תוכן עם אינדקס n, הבקר מחזיר את הקודים הבאים:
- אינדקס n+1 (פריט המדיה הבא): טעינה של 3,000 אלפיות השנייה (3 שניות) מנקודת ההתחלה שמוגדרת כברירת מחדל
- אינדקס n-1 (פריט המדיה הקודם): טעינה של 1,000 אלפיות השנייה (שנייה אחת) מנקודת ההתחלה שמוגדרת כברירת מחדל
- פריטי מדיה אחרים בטווח n-2 עד n+2: Return
PreloadStatus.TRACKS_SELECTED - פריטי מדיה אחרים בטווח n-4 עד n+4: מקש Return
PreloadStatus.SOURCE_PREPARED - לכל שאר פריטי המדיה, מחזירים את הערך
null
class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> { override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus { if (index - currentPlayingIndex == 1) { // next track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (index - currentPlayingIndex == -1) { // previous track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (abs(index - currentPlayingIndex) == 2) { // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
מידע חשוב על הקוד
- כשיוצרים מנהל טעינה מראש, מעבירים אליו מופע של
MyTargetPreloadStatusControl. -
currentPlayingIndexמחזיק את האינדקס של פריט המדיה שמופעל כרגע. האפליקציה אחראית לעדכן את הערך הזה. - כשהכלי לניהול טעינה מראש מוכן לטעון תוכן, הוא קורא ל-
getTargetPreloadStatusומעביר את פרטי הדירוג שציינתם עבור פריט המדיה התואם. במקרה שלDefaultPreloadManager, המידע הזה הוא מספר שלם שמציין את מיקום הפריט בקרוסלה. השיטה בוחרת איזה קוד להחזיר על ידי השוואה בין האינדקס הזה לבין האינדקס של הפריט שנבחר כרגע.
יצירת מנהל הטעינה מראש
כדי ליצור את הכלי לניהול טעינה מראש, צריך DefaultPreloadManager.Builder.
הכלי הזה מוגדר עם ההקשר הנוכחי ועם אמצעי הבקרה על סטטוס הטעינה מראש של האפליקציה. אפשר ליצור כלי לניהול טעינה מראש עם כל הגדרות ברירת המחדל.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
הכלי לבנייה מספק גם שיטות setter שבהן אפשר להשתמש כדי להגדיר את הרכיבים המותאמים אישית של מנהל הטעינה מראש.
לדוגמה, אתם יכולים להתאים אישית את יעד הבייטים הכולל של המאגר לכל מקורות המדיה לטעינה מראש ב-DefaultPreloadManager, כך שהנתונים שנטענו מראש לא יעברו את המגבלה הזו. אפשר להגדיר את המגבלה הזו באמצעות setPlayerTargetBufferBytes(String, int) ב-DefaultLoadControl.Builder בהתאמה אישית עם שם הנגן "preload" ולהעביר את המופע הזה ל-preload manager builder:
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) preloadManagerBuilder.setLoadControl( DefaultLoadControl.Builder() .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB .build() ) val preloadManager = preloadManagerBuilder.build()
אמנם שיטות ההגדרה של האובייקט Builder הן אופציונליות לצורך התאמה אישית, אבל אם רוצים לשמור במטמון פריטי מדיה בדיסק, צריך להגדיר את האובייקט Builder באמצעות Cache על ידי קריאה ל-setCache(). אם לא מוגדר מטמון, ניסיון לשמור במטמון את פריטי המדיה יוביל לשגיאה IllegalStateException.
יצירת ExoPlayer להפעלת פריט המדיה שנטען מראש
בנוסף לשימוש בכלי ליצירת מנהל הטעינה מראש, תשתמשו בו גם כדי ליצור את אובייקטי ExoPlayer שהאפליקציה משתמשת בהם כדי להפעיל את התוכן, כך שרכיבים משותפים יועברו ממנהל הטעינה מראש אל ExoPlayer בצורה נכונה. עדיין אפשר להגדיר את ההגדרות הספציפיות להפעלה של ExoPlayer על ידי העברת מופע ExoPlayer.Builder עם ההגדרות האלה.
// Direct creation val exoPlayer = preloadManagerBuilder.buildExoPlayer() // Creation with custom playback specific configurations val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true) val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)