媒體項目

playlist APIMediaItem 例項為基礎,可方便使用 MediaItem.Builder 建構。在播放器中,MediaItem 會由 MediaSource.Factory 轉換為可播放的 MediaSource。如果沒有自訂設定,系統會透過 DefaultMediaSourceFactory 執行這項轉換作業,後者可建立複雜的媒體來源,以對應媒體項目的屬性。以下列出可在媒體項目上設定的部分屬性。

簡單的媒體項目

您可以使用 fromUri 便利方法,建立僅包含串流 URI 的媒體項目:

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

圖片

圖片播放功能需要在媒體項目中指定時間長度,以便在播放期間顯示圖片。如要進一步瞭解動態相片圖片載入程式庫 (例如 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