播放列表 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 = 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() 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()) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
在内部,DefaultMediaSourceFactory 会将内容媒体来源封装在 AdsMediaSource 中,以插入广告代码定义的广告。为此,播放器还需要相应地配置其 DefaultMediaSourceFactory。