我正在使用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,提取内容并将数据传回是否更好。我不确定这两个组件之间有什么区别,或者哪个更合适,并且缺少文档。
答案 0 :(得分:4)
因此,解析此XML文件应由视频播放器负责,而不是由客户端的应用负责。
因此,您实质上是在尝试创建一种新的架构,以便为基础播放器分发视频(无论如何处理)。这似乎是客户端逻辑。但是,您需要一个答案,所以我将尝试给您一个答案。
首先,根据文档,Extractor
中的ExoPlayer
不应用于解析您的XML
:
从容器格式中提取媒体数据。
这将用于从视频容器中提取视频数据,例如MP4。
在您的场景中,您可能想要查看与DashManifestParser
类似的事物,后者使用ParsingLoadable.Parser
来负责解析您的输入模型。然后ParsingLoadable.Parser
使用此MediaSource
获取播放所需的信息。
但是,我不建议您这样做。在这种情况下,最好的选择是创建一个Parser
来获取内容网址,然后将其传递给基础播放器。您的内容网址将链接到MP4
容器,也许链接到DRM的内容等,但是播放器可以很好地处理所有这些内容,而不会增加所有其他复杂性。
关于创建广告,可以通过多种方式完成:
ConcatenatingMediaSource
,为此您将解析xml
,为内容和每个广告创建一个MediaSource
,然后将它们添加到{{1 }}。ConcatenatingMediaSource
提供的AdsLoader
。这是最好的解决方案,但可惜缺少文档。为此,您可以提供加载广告的链接和单独的加载内容的链接。所以。总结一下。
如果您想了解如何做某些方面,我建议您看一下使用ExoPlayer
的开放源码库。我们甚至最近开始使用Exo-Player
。 https://github.com/novoda/no-player