playlist API 是以 MediaItem
例項為基礎,相當可輕鬆建立
使用 MediaItem.Builder
。在播放器中,MediaItem
會轉換為
MediaSource.Factory
的可播放 MediaSource
。不含
自訂設定
這項轉換是由 DefaultMediaSourceFactory
執行,
能夠建立與
媒體項目。本表列出可在媒體項目上設定的部分屬性
。
簡易媒體項目
僅由串流 URI 組成的媒體項目可以使用 fromUri
建構
便利方法:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
如果不是上述情況,則可使用 MediaItem.Builder
。在以下範例中
媒體項目會使用 ID 和一些附加中繼資料來建立:
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 和 流暢串流。如果這類自動調整媒體項目的 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
。