פריטי מדיה

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

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

תמונות

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

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 בהתאם לצרכים שלכם.

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

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

Kotlin

val subtitle =
  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.

הוספת מודעות

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

Kotlin

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

Java

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

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