מקורות מדיה

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

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

‫DefaultMediaSourceFactory יכול גם ליצור מקורות מדיה מורכבים יותר, בהתאם למאפיינים של קובצי המדיה המתאימים. הנושא הזה מתואר בפירוט בדף פריטי המדיה.

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

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

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

Kotlin

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

Java

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) של ה-factory תיקרא כדי ליצור מקור מדיה לכל קובץ מדיה שנוסף לפלייליסט.

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

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

Kotlin

// 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()

Java

// 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 כשמפעילים את ה-constructor, כדי לוודא שכל המקורות מתחילים ומסתיימים באותו זמן. אם השינוי הזה נעשה כדי להוסיף כתוביות שנטענות מהצד, עדיף להשתמש במקום זאת ב-MediaItem.SubtitleConfiguration.
  • ‫ConcatenatingMediaSource2: מיזוג של כמה מקורות מדיה להפעלה ברצף. מבנה המדיה שגלוי למשתמש חושף Timeline.Window יחיד, כלומר הוא נראה כמו פריט אחד. אם השינוי הזה נעשה כדי להפעיל כמה פריטים שלא אמורים להיראות כמו פריט אחד, עדיף להשתמש בשיטות של playlist API כמו Player.addMediaItem.
  • ‫SilenceMediaSource: יוצר שקט למשך זמן מוגדר, וזה שימושי למילוי פערים.
  • ‫AdsMediaSource: הרחבה של מקור מדיה עם יכולות להוספת מודעות בצד הלקוח. פרטים נוספים זמינים במדריך להוספת מודעות.
  • ‫ServerSideAdInsertionMediaSource: הרחבה של מקור מדיה עם יכולות להוספת מודעות בצד השרת. פרטים נוספים זמינים במדריך להוספת מודעות.