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 = 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
בהתאם בנגן.