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