מקורות מדיה

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

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