פריטי מדיה

ה-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 כדי לעטוף את מקור המדיה של התוכן. יש מאפייני חיתוך נוספים. פרטים נוספים זמינים ב-Javadoc של MediaItem.Builder.

הוספת מודעות

כדי להוסיף מודעות, צריך להגדיר את מאפיין ה-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 של הנגן.