פריטי מדיה

playlist API מבוסס על מופעים של MediaItem, שאפשר ליצור בקלות באמצעות MediaItem.Builder. בתוך הנגן, קובץ MediaItem מומר לקובץ MediaSource שניתן להפעלה על ידי MediaSource.Factory. ללא הגדרה בהתאמה אישית, ההמרה הזו מתבצעת על ידי DefaultMediaSourceFactory, שיכול ליצור מקורות מדיה מורכבים שתואמים למאפיינים של פריט המדיה. בהמשך מפורטים חלק מהמאפיינים שאפשר להגדיר לפריטי מדיה.

פריטי מדיה פשוטים

אפשר ליצור פריט מדיה שמורכב רק מ-URI של שידור באמצעות שיטת הנוחות fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

בכל שאר המקרים, אפשר להשתמש ב-MediaItem.Builder. בדוגמה הבאה, פריט מדיה נוצר עם מזהה וכמה מטא-נתונים מצורפים:

Kotlin

val mediaItem =
  MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();

צירוף מטא-נתונים יכול להיות שימושי לעדכון ממשק המשתמש של האפליקציה כשמתרחשים מעברים בין פלייליסטים.

תמונות

כדי להפעיל תמונות, צריך לציין את משך הזמן שבו התמונה תוצג במהלך ההפעלה בפריט המדיה. מידע נוסף על תמונות דינמיות ועל ספריות לטעינת תמונות (לדוגמה, Glide) זמין בדף המדריך בנושא תמונות.

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();

סיומות קבצים לא סטנדרטיות למדיה דינמית

‫ExoPlayer מספק מקורות מדיה דינמיים ל-DASH, ל-HLS ול-SmoothStreaming. אם ה-URI של פריט מדיה מותאם מסוג כזה מסתיים בתוסף קובץ רגיל, מקור המדיה המתאים נוצר באופן אוטומטי. אם ל-URI יש סיומת לא סטנדרטית או שאין לו סיומת בכלל, אפשר להגדיר את סוג ה-MIME באופן מפורש כדי לציין את הסוג של פריט המדיה:

Kotlin

val mediaItem =
  MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();

בסטרימינג של מדיה מתקדמת לא נדרש סוג MIME.

תוכן מוגן

בתוכן מוגן, צריך להגדיר את מאפייני ה-DRM של פריט המדיה. חובה לציין את ה-UUID, וכל שאר המאפיינים הם אופציונליים.

דוגמה להגדרת הפעלה של פריט שמוגן באמצעות Widevine DRM, שבה ה-URI של הרישיון לא זמין ישירות במדיה (למשל, בפלייליסט של DASH) ונדרשים כמה סשנים (למשל, בגלל רוטציה של מפתחות):

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setDrmConfiguration(
      MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
        .setLicenseUri(licenseUri)
        .setMultiSession(true)
        .setLicenseRequestHeaders(httpRequestHeaders)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setDrmConfiguration(
            new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
                .setLicenseUri(licenseUri)
                .setMultiSession(true)
                .setLicenseRequestHeaders(httpRequestHeaders)
                .build())
        .build();

בתוך נגן DefaultMediaSourceFactory, המאפיינים האלה יועברו אל DrmSessionManagerProvider כדי לקבל DrmSessionManager, שיוזרק אל MediaSource שנוצר. אפשר להתאים אישית את אופן הפעולה של DRM לפי הצרכים שלכם.

התקנה ממקור לא ידוע של טראקים של כתוביות

כדי להוסיף רצועות של כתוביות באמצעות Sideloading, אפשר להוסיף מופעים של MediaItem.Subtitle כשיוצרים פריט מדיה:

Kotlin

val subtitle =
  MediaItem.SubtitleConfiguration.Builder(subtitleUri)
    .setMimeType(mimeType) // The correct MIME type (required).
    .setLanguage(language) // The subtitle language (optional).
    .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
    .build()
val mediaItem =
  MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()

Java

MediaItem.SubtitleConfiguration subtitle =
    new MediaItem.SubtitleConfiguration.Builder(subtitleUri)
        .setMimeType(mimeType) // The correct MIME type (required).
        .setLanguage(language) // The subtitle language (optional).
        .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
        .build();
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setSubtitleConfigurations(ImmutableList.of(subtitle))
        .build();

באופן פנימי, DefaultMediaSourceFactory ישתמש ב-MergingMediaSource כדי לשלב את מקור המדיה של התוכן עם SingleSampleMediaSource לכל טראק של כתוביות. ‫DefaultMediaSourceFactory לא תומך בהוספת כתוביות ל-DASH עם כמה תקופות.

חיתוך של שידור מדיה

כדי לחתוך את התוכן שאליו מתייחס פריט מדיה, מגדירים מיקומי התחלה וסיום מותאמים אישית:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(startPositionMs)
        .setEndPositionMs(endPositionMs)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder()
                .setStartPositionMs(startPositionMs)
                .setEndPositionMs(endPositionMs)
                .build())
        .build();

באופן פנימי, DefaultMediaSourceFactory ישתמש ב-ClippingMediaSource כדי לעטוף את מקור המדיה של התוכן. יש מאפיינים נוספים של קליפים. פרטים נוספים מופיעים ב-MediaItem.Builder Javadoc.

הוספת מודעות

כדי להוסיף מודעות, צריך להגדיר את המאפיין ad tag URI של פריט מדיה:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

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