媒体来源

在 ExoPlayer 中,每一项媒体都由一个 MediaItem 表示。不过, 在内部,播放器需要 MediaSource 实例才能播放内容。通过 播放器会使用 MediaSource.Factory 从媒体项创建这些元素。

默认情况下,播放器使用 DefaultMediaSourceFactory, 以下内容 MediaSource 实现的实例:

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:合并多个媒体源以并行播放。在 几乎在所有情况下,建议您使用 将 adjustPeriodTimeOffsetsclipDurations 设置为 true,以确保 来源的开始时间和结束时间相同。如果完成此修改 旁加载字幕,最好使用 MediaItem.SubtitleConfiguration
  • ConcatenatingMediaSource2:合并要播放的多个媒体来源 。用户可见的媒体结构公开了 Timeline.Window,表示它看起来像是单个商品。如果 并进行了多项修改,播放了多项 建议使用播放列表 API 方法,例如 Player.addMediaItem
  • SilenceMediaSource:在指定时长内生成静音 有助于填补数据缺口。
  • AdsMediaSource:使用客户端广告插播功能扩展媒体来源 功能。如需了解详情,请参阅广告插播指南
  • ServerSideAdInsertionMediaSource:使用服务器端广告扩展媒体来源 插入功能。如需了解详情,请参阅广告插播指南