ExoPlayer 2 – MediaSource composition(官方博客翻译)

 MediaSource composition是ExoPlayer 2中的一个强大的概念,可启用诸如侧加载字幕,循环播放和播放一系列视频之类的功能。
复制代码

要在ExoPlayer 2中播放媒体,应用程序必须创建一个相应的MedisSource对象提供给播放器,例如,要播放MP4,应用程序必须创建一个ExtractorMediaSource:
ExtractorMediaSource适用于常规媒体文件(mp4,webm,mkv等)

MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri, ...);
//这个资源是提供给播放器播放的.
player.prepare(videoSource, true);
复制代码

ExtractorMediaSource适用于常规媒体文件(mp4,webm,mkv等)。 ExoPlayer库还提供DASH(DashMediaSource),SmoothStreaming(SsMediaSource)和HLS(HlsMediaSource)的MediaSource实现。

除了上述MediaSource实现之外,ExoPlayer库还提供了MergingMediaSource,LoopingMediaSource和ConcatenatingMediaSource。这些是示例MediaSource实现,可通过合成实现更复杂的播放功能。我们在下面描述了一些常见的用例。注意,尽管以下示例是在视频播放的上下文中描述的,但它们同样适用于仅音频的播放,实际上也适用于任何受支持的媒体类型的播放。

侧加载字幕文件

指定视频文件和单独的字幕文件,可以使用MergingMediaSource将它们合并为单个源以进行播放。

MediaSource videoSource = new ExtractorMediaSource(videoUri, ...);
MediaSource subtitleSource = new SingleSampleMediaSource(subtitleUri, ...);
// 播放视频时加载测加载字幕
MergingMediaSource mergedSource = new MergingMediaSource(videoSource, subtitleSource);
复制代码

无缝循环播放视频

可以使用LoopingMediaSource无缝循环播放视频。以下示例是无限循环播放视频。创建LoopingMediaSource时也可以指定有限循环的次数。

MediaSource source = new ExtractorMediaSource(videoUri, ...);
// 无限循环视频.
LoopingMediaSource loopingSource = new LoopingMediaSource(source);
复制代码

无缝播放一系列视频

ConcatenatingMediaSource可以顺序播放两个或多个单独的MediaSource。以下示例是按顺序播放两个视频。源之间的切换是无缝的。并不需要连接的源具有相同的格式(例如,支持将包含480p H264的视频文件与包含720p VP9的视频文件串联播放)。来源甚至可以是不同的类型(例如,支持将视频与纯音频流串联播放)

MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// 播放第一个视频然后播放第二个
ConcatenatingMediaSource concatenatedSource =new ConcatenatingMediaSource(firstSource, secondSource);
复制代码

高级组合(Advanced composition)

可以进一步组合复合MediaSource,以用于更多不常见的用例。给定两个视频A和B,以下示例显示了如何将LoopingMediaSource和ConcatenatingMediaSource一起使用以无限期地循环序列(A,A,B)

MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// 播放两遍第一个视频.
LoopingMediaSource firstSourceTwice = new LoopingMediaSource(firstSource, 2);
// 播放两遍第一个视频,然后播放第二个。
ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(firstSourceTwice, secondSource);
// 无限循环此序列的视频.
LoopingMediaSource compositeSource = new LoopingMediaSource(concatenatedSource);
复制代码

以下示例是等效的,表示可以有多种方法来获得相同的结果。

MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...);
MediaSource secondSource = new ExtractorMediaSource(secondVideoUri, ...);
// 播放两遍第一个视频,然后播放第二个。
ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(firstSource, firstSource, secondSource);
// 无限循环此序列的视频.
LoopingMediaSource compositeSource = new LoopingMediaSource(concatenatedSource);
复制代码

重要说明:除非在文档中明确允许,否则避免在组合中多次使用同一MediaSource实例,这一点很重要。在上面的示例中两次使用firstSource就是这种情况,因为ConcatenatingMediaSource的Javadoc明确声明允许重复的条目。但是,一般而言,由组合构成的对象图应该是树状的结构。允许在合成中使用多个等效的MediaSource实例。

总而言之,MediaSource composition是ExoPlayer 2中的一个强大概念,可启用诸如侧加载字幕,循环播放和播放视频序列之类的功能。除非在文档中明确允许,否则必须避免在组合中多次使用同一MediaSource实例,这一点很重要。

原文链接:ExoPlayer 2 – MediaSource composition

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享