מקורות מדיה

ב-ExoPlayer, כל פריט מדיה מיוצג על ידי MediaItem. עם זאת, בפנים הנגן צריך MediaSource מופעים כדי להפעיל את התוכן. הנגן יוצר אותם מפריטי מדיה באמצעות MediaSource.Factory.

כברירת מחדל, הנגן משתמש ב-DefaultMediaSourceFactory, שיכול ליצור מכונות של הטמעות MediaSource התוכן הבאות:

DefaultMediaSourceFactory יכול גם ליצור מקורות מדיה מורכבים יותר בהתאם למאפיינים של פריטי המדיה המתאימים. אפשר לקרוא על כך בהרחבה בדף 'פריטי מדיה'.

באפליקציות שצריכות הגדרות של מקורות מדיה שלא נתמכות בתצורת ברירת המחדל של הנגן, יש כמה אפשרויות להתאמה אישית.

התאמה אישית של יצירת מקורות מדיה

כשיוצרים את הנגן, אפשר להזריק MediaSource.Factory. לדוגמה, אם אפליקציה רוצה להוסיף מודעות ולהשתמש ב-CacheDataSource.Factory כדי לתמוך בשמירה במטמון, אפשר להגדיר מכונה של DefaultMediaSourceFactory כך שתתאים לדרישות האלה ולהחדיר אותה במהלך יצירת הנגן:

  val mediaSourceFactory: MediaSource.Factory =
   
DefaultMediaSourceFactory(context)
     
.setDataSourceFactory(cacheDataSourceFactory)
     
.setLocalAdInsertionComponents(adsLoaderProvider, playerView)
 
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
MediaSource.Factory mediaSourceFactory =
   
new DefaultMediaSourceFactory(context)
       
.setDataSourceFactory(cacheDataSourceFactory)
       
.setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
   
new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

ב-DefaultMediaSourceFactory JavaDoc מתוארות בפירוט רב יותר האפשרויות הזמינות.

אפשר גם להחדיר הטמעה מותאמת אישית של MediaSource.Factory, למשל כדי לתמוך ביצירה של סוג מותאם אישית של מקור מדיה. createMediaSource(MediaItem) של המפעל ייכלל כדי ליצור מקור מדיה לכל פריט מדיה שנוסף לפלייליסט.

API של פלייליסט שמבוסס על מקור מדיה

בממשק ExoPlayer מוגדרות שיטות נוספות של פלייליסטים שמקבלות מקורות מדיה במקום פריטים של מדיה. כך אפשר לעקוף את MediaSource.Factory הפנימי של הנגן ולהעביר ישירות לנגן את המופעים של מקורות המדיה:

// Set a list of media sources as initial playlist.
exoPlayer
.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer
.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer
.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer
.prepare()
exoPlayer
.play()
// Set a list of media sources as initial playlist.
exoPlayer
.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer
.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer
.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer
.prepare();
exoPlayer
.play();

יצירה מתקדמת של מקורות מדיה

ExoPlayer מספק מספר הטמעות של MediaSource כדי לשנות ולכתוב מכונות MediaSource אחרות. האפשרויות האלה הכי שימושיות במקרים שבהם צריך לשלב כמה התאמות אישיות ואף אחת מהדרכים הפשוטה יותר להגדרה לא מספיקה.

  • ClippingMediaSource: מאפשרת לחתוך מדיה לטווח חותמות זמן מסוים. אם זהו השינוי היחיד, עדיף להשתמש במקום זאת ב-MediaItem.ClippingConfiguration.
  • FilteringMediaSource: מסננים זמינים לסוגים מסוימים של טראקים. לדוגמה, חשיפת טראק הווידאו מקובץ שמכיל גם אודיו וגם וידאו. אם זהו השינוי היחיד, עדיף להשתמש במקום זאת בפרמטרים לבחירת טראקים.
  • MergingMediaSource: מיזוג של כמה מקורות מדיה להפעלה בו-זמנית. ברוב המקרים מומלץ לקרוא למבנה עם הערכים adjustPeriodTimeOffsets ו-clipDurations מוגדרים כ-true, כדי לוודא שכל המקורות מתחילים ומסיימים באותו זמן. אם השינוי הזה נעשה כדי להוסיף כתוביות שהועלו בנפרד, עדיף להשתמש במקום זאת ב-MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: מיזוג של כמה מקורות מדיה להפעלה ברצף. מבנה המדיה שגלוי למשתמש חושף Timeline.Window יחיד, כלומר הוא נראה כמו פריט יחיד. אם השינוי הזה בוצע כדי להפעיל מספר פריטים שלא אמורים להיראות כמו פריט יחיד, עדיף להשתמש במקום זאת בשיטות של ה-API של הפלייליסט, כמו Player.addMediaItem.
  • SilenceMediaSource: יצירת שתיקה למשך זמן מסוים כדי למלא את הפערים.
  • AdsMediaSource: הרחבה של מקור מדיה עם יכולות להוספת מודעות בצד הלקוח. פרטים נוספים זמינים במדריך להוספת מודעות.
  • ServerSideAdInsertionMediaSource: הרחבה של מקור מדיה עם יכולות להוספת מודעות בצד השרת. פרטים נוספים זמינים במדריך להוספת מודעות.