播放列表 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 很有用。
图像
图像的播放需要在媒体项目中指定持续时间,以指定图像在播放期间应显示多长时间。有关 图像、动态照片 和 图像加载库(例如 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
相应地配置。