自定义ExoPlayer MediaSource-从哪里开始?

时间:2019-05-13 15:01:56

标签: android exoplayer exoplayer2.x

我正在使用ExoPlayer创建自定义媒体播放器(我之前在同一主题上曾提出过几个问题,因为我对Android开发非常陌生,似乎我碰到了很多麻烦,我写的代码)。

作为这个自定义播放器的一部分,我想下载,解析和处理我们的业务为定义我们的内容而生成的XML文件。此XML文件提供了一个网络ID的URL(向内容所有者投放广告的4-6秒视频),该内容的URL以及一个用于播放插播广告和插播广告的广告标签URL。

我的目标是将该XML文件作为视频源传递给prepare(),调用setPlayWhenReady(true),然后使所有内容按预期播放(网络ID,内容和广告)

为此,我相信我需要创建一个自定义MediaSource,但是我找不到任何很好的文档或教程。 The ExoPlayer documentation on MediaSources在这种情况下几乎没有用,仅描述了如何利用ConcatenatingMediaSource,MergingMediaSource和LoopingMediaSource自定义媒体播放。

更新

继续我自己进行研究,可能需要使用定制的Extractor来实现我想要的功能。将内容传递到ExtractorMediaSource时,收到错误com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor) could read the stream.。这让我想知道让 Extractor 解析XML,提取内容并将数据传回是否更好。我不确定这两个组件之间有什么区别,或者哪个更合适,并且缺少文档。

1 个答案:

答案 0 :(得分:4)

  

因此,解析此XML文件应由视频播放器负责,而不是由客户端的应用负责。

因此,您实质上是在尝试创建一种新的架构,以便为基础播放器分发视频(无论如何处理)。这似乎是客户端逻辑。但是,您需要一个答案,所以我将尝试给您一个答案。

首先,根据文档,Extractor中的ExoPlayer不应用于解析您的XML

  

从容器格式中提取媒体数据。

这将用于从视频容器中提取视频数据,例如MP4。

在您的场景中,您可能想要查看与DashManifestParser类似的事物,后者使用ParsingLoadable.Parser来负责解析您的输入模型。然后ParsingLoadable.Parser使用此MediaSource获取播放所需的信息。

但是,我不建议您这样做。在这种情况下,最好的选择是创建一个Parser来获取内容网址,然后将其传递给基础播放器。您的内容网址将链接到MP4容器,也许链接到DRM的内容等,但是播放器可以很好地处理所有这些内容,而不会增加所有其他复杂性。

关于创建广告,可以通过多种方式完成:

  • 只有一个播放器实例,可以在内容和广告之间交换。容易,但是您需要跟踪位置信息,并且切换时也会有缓冲。
  • 只有一个玩家实例,但使用ConcatenatingMediaSource,为此您将解析xml,为内容和每个广告创建一个MediaSource,然后将它们添加到{{1 }}。
  • 只有一个玩家实例,但使用ConcatenatingMediaSource提供的AdsLoader。这是最好的解决方案,但可惜缺少文档。为此,您可以提供加载广告的链接和单独的加载内容的链接。

所以。总结一下。

  • 创建一个解析器,该解析器可以从XML中获取所需的信息,即内容链接和广告链接。
  • 创建一个播放器,该播放器先为内容创建媒体源,然后为广告创建媒体源,然后将其添加到串联的媒体源中。

如果您想了解如何做某些方面,我建议您看一下使用ExoPlayer的开放源码库。我们甚至最近开始使用Exo-Playerhttps://github.com/novoda/no-player