这个系列文章我们来介绍一位海外工程师如何探索 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
:扩展媒体源,使其具有服务器端广告插入功能。详情请参阅广告插入指南。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。