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();
系統在播放清單轉換時,附加中繼資料有助於更新應用程式的 UI。
處理非標準副檔名
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 屬性:
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();
本例會為 Widevine 受保護內容建構媒體項目。在播放器中,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
,遊戲才會使用這項功能。