在 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
实例。如果有多个客户 ID
需要合并自定义设置,
。
ClippingMediaSource
:允许将媒体剪辑到指定的时间戳范围。 如果这是唯一的修改,最好使用MediaItem.ClippingConfiguration
。FilteringMediaSource
:过滤适用于指定类型的可用轨道, 例如,公开一个包含两个音频的文件中的视频轨道 以及视频。如果这是唯一的修改,最好使用 跟踪选择参数。MergingMediaSource
:合并多个媒体源以并行播放。在 几乎在所有情况下,建议您使用 将adjustPeriodTimeOffsets
和clipDurations
设置为 true,以确保 来源的开始时间和结束时间相同。如果完成此修改 旁加载字幕,最好使用MediaItem.SubtitleConfiguration
。ConcatenatingMediaSource2
:合并要播放的多个媒体来源 。用户可见的媒体结构公开了Timeline.Window
,表示它看起来像是单个商品。如果 并进行了多项修改,播放了多项 建议使用播放列表 API 方法,例如Player.addMediaItem
。SilenceMediaSource
:在指定时长内生成静音 有助于填补数据缺口。AdsMediaSource
:使用客户端广告插播功能扩展媒体来源 功能。如需了解详情,请参阅广告插播指南。ServerSideAdInsertionMediaSource
:使用服务器端广告扩展媒体来源 插入功能。如需了解详情,请参阅广告插播指南。