在 ExoPlayer 中,每段媒体都由一个MediaItem
表示。但是,播放器内部需要MediaSource
实例来播放内容。播放器使用MediaSource.Factory
从媒体项目创建这些实例。
默认情况下,播放器使用DefaultMediaSourceFactory
,它可以创建以下内容MediaSource
实现的实例
DashMediaSource
用于 DASH。SsMediaSource
用于 SmoothStreaming。HlsMediaSource
用于 HLS。ProgressiveMediaSource
用于 常规媒体文件。RtspMediaSource
用于 RTSP。
DefaultMediaSourceFactory
还可以根据相应媒体项目的属性创建更复杂的媒体源。这在媒体项目页面中有更详细的说明。
对于需要播放器默认配置不支持的媒体源设置的应用,有多种自定义选项。
自定义媒体源创建
构建播放器时,可以注入MediaSource.Factory
。例如,如果一个应用想要插入广告并使用CacheDataSource.Factory
来支持缓存,则可以配置DefaultMediaSourceFactory
的实例以匹配这些要求,并在播放器构建过程中注入。
Kotlin
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, playerView) val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
DefaultMediaSourceFactory
JavaDoc更详细地描述了可用选项。
还可以注入自定义MediaSource.Factory
实现,例如支持创建自定义媒体源类型。该工厂的createMediaSource(MediaItem)
将被调用以创建添加到播放列表的每个媒体项目的媒体源。
基于媒体源的播放列表 API
ExoPlayer
接口定义了其他接受媒体源而不是媒体项目的播放列表方法。这使得可以绕过播放器的内部MediaSource.Factory
并将媒体源实例直接传递给播放器。
Kotlin
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources) // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource) // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)) exoPlayer.prepare() exoPlayer.play()
Java
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources); // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource); // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)); exoPlayer.prepare(); exoPlayer.play();
高级媒体源组合
ExoPlayer 提供多个MediaSource
实现来修改和组合其他MediaSource
实例。当必须组合多个自定义项并且没有足够的简单设置路径时,这些方法最为有用。
ClippingMediaSource
:允许将媒体剪辑到指定的时戳范围。如果这是唯一的修改,最好使用MediaItem.ClippingConfiguration
。FilteringMediaSource
:将可用轨道过滤到指定的类型,例如,只公开包含音频和视频文件的视频轨道。如果这是唯一的修改,最好使用轨道选择参数。MergingMediaSource
:合并多个媒体源以并行播放。在几乎所有情况下,建议将构造函数与adjustPeriodTimeOffsets
和clipDurations
设置为 true,以确保所有源同时开始和结束。如果进行此修改是为了添加侧载字幕,最好使用MediaItem.SubtitleConfiguration
。ConcatenatingMediaSource2
:合并多个媒体源以连续播放。用户可见的媒体结构公开单个Timeline.Window
,这意味着它看起来像单个项目。如果进行此修改是为了播放不应该看起来像单个项目的多个项目,最好使用播放列表 API方法,例如Player.addMediaItem
。SilenceMediaSource
:生成指定持续时间的静音,用于填充间隙。AdsMediaSource
:使用客户端广告插入功能扩展媒体源。有关详细信息,请参阅广告插入指南。ServerSideAdInsertionMediaSource
:使用服务器端广告插入功能扩展媒体源。有关详细信息,请参阅广告插入指南。