媒体项

playlist API 基于 MediaItem 实例,可方便地构建 使用 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();

附加元数据有助于 更新应用界面 在发生播放列表转换时触发。

图片

如要播放图片,需要在媒体项中指定时长来指明时长 播放过程中应显示该图片请参阅 映像指南页面,详细了解 动态照片图片加载库 (例如 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 的字幕。

剪辑媒体流

如需剪辑媒体项引用的内容,请将 custom 起始位置和结束位置:

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 进行相应配置

<ph type="x-smartling-placeholder">