媒體項目

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