我正致力于使用ExoPlayer创建一个定制的媒体播放器(我以前曾就同一主题提出过几个问题,因为我对Android开发非常陌生,而且我写的每一行代码似乎都碰壁了)。
作为这个自定义播放器的一部分,我想下载、解析和处理我们的业务生成的XML文件来定义我们的内容。这个XML文件提供了一个网络ID的URL ( 4-6秒的视频广告内容的所有者),一个内容的URL,以及一个播放预卷和中间卷广告的广告标签URL。
我的目标是将这个XML文件作为视频源传递给prepare(),调用setPlayWhenReady(true),然后按预期播放所有内容(网络ID、内容和广告)。
要做到这一点,我相信我需要创建一个定制的MediaSource --但是我找不到任何好的文档或教程。在这种情况下,关于ExoPlayer的MediaSources文档实际上是无用的,只描述了如何使用ConcatenatingMediaSource、MergingMediaSource和LoopingMediaSource来定制媒体的回放。
更新
继续我自己的研究,这是可能的,我想要的可能是通过一个定制的抽油车完成。当我将内容传递给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,提取内容,并将数据传回。我还不确定这两个组件之间的区别是什么,或者哪个更适合,并且缺乏文档。
发布于 2019-05-14 09:23:28
因此,解析这个XML文件应该是视频播放器的责任,而不是客户端应用程序的责任。
因此,您实际上是在尝试创建一个新的模式,用于为底层播放器分发视频(不管是什么,都可以处理)。这似乎是客户端的逻辑。但是,你想要一个答案,所以我试着给你一个答案。
首先,不应该使用Extractor in ExoPlayer来解析您的XML,正如文档所示:
从容器格式中提取媒体数据。
这将用于从例如MP4的视频容器中提取视频数据。
在您的场景中,您可能希望看到类似于使用DashManifestParser的ParsingLoadable.Parser,其职责是解析您的输入模型。然后,这个ParsingLoadable.Parser被MediaSource用来获取回放所需的信息。
然而,我不建议这样做。在这个场景中,最好的选择是创建一个Parser来获取内容Url,并将其传递给底层播放器。您的content将链接到一个MP4容器,可能是DRM的内容等等,但所有这些都可以由播放器很好地处理,而无需添加所有其他复杂性。
至于创建广告,可以通过多种方式做到这一点:
ConcatenatingMediaSource,为此您将解析xml,为内容和每个广告创建一个MediaSource,然后将这些添加到ConcatenatingMediaSource中。AdsLoader提供的ExoPlayer。这是最好的解决方案,但令人遗憾的是缺乏文档。为此,您可以提供一个加载广告的链接和一个单独的加载内容链接。所以。总结一下。
如果您想了解如何做某些事情,我建议您看看我们的开源库,它在幕后使用了Exo-Player。我们最近甚至开始使用AdsLoader。https://github.com/novoda/no-player
https://stackoverflow.com/questions/56115056
复制相似问题