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