探索 ExoPlayer 音视频播放技术(5):媒体源

这个系列文章我们来介绍一位海外工程师如何探索 ExoPlayer 音视频播放技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 5 篇:ExoPlayer 媒体源。

—— 来自公众号关键帧Keyframe的分享

媒体源流程

在 ExoPlayer 中,每个媒体文件都由一个 MediaItem 表示。但在内部,播放器需要 MediaSource 实例来播放内容。播放器通过 MediaSource.Factory 从媒体项创建这些实例。

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

  • DashMediaSource 用于 DASH。
  • SsMediaSource 用于 SmoothStreaming。
  • HlsMediaSource 用于 HLS。
  • ProgressiveMediaSource 用于普通媒体文件。
  • RtspMediaSource 用于 RTSP。

DefaultMediaSourceFactory 还可以根据相应媒体项的属性创建更复杂的媒体源。这在 媒体项页面 中有更详细的描述。

对于需要默认配置无法支持的媒体源设置的应用,有几种自定义选项。

在构建播放器时,可以注入 MediaSource.Factory。例如,如果应用需要插入广告并使用 CacheDataSource.Factory 来支持缓存,可以配置 DefaultMediaSourceFactory 以满足这些需求,并在构建播放器时注入:

val mediaSourceFactory: MediaSource.Factory =
    DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
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) 将被调用来为添加到播放列表的每个媒体项创建媒体源。

ExoPlayer 接口定义了额外的播放列表方法,这些方法接受媒体源而不是媒体项。这使得可以绕过播放器的内部 MediaSource.Factory,直接将媒体源实例传递给播放器:

// 设置媒体源列表作为初始播放列表。
exoPlayer.setMediaSources(listOfMediaSources)
// 添加单个媒体源。
exoPlayer.addMediaSource(anotherMediaSource)

// 可以与媒体项 API 结合使用。
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()
// 设置媒体源列表作为初始播放列表。
exoPlayer.setMediaSources(listOfMediaSources);
// 添加单个媒体源。
exoPlayer.addMediaSource(anotherMediaSource);

// 可以与媒体项 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:扩展媒体源,使其具有服务器端广告插入功能。详情请参阅广告插入指南。

音视频方向学习、求职,欢迎加入我们的星球

丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

探索 ExoPlayer 音视频播放技术(5):媒体源

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论