【问题标题】:Custom ExoPlayer MediaSource -- where to start?自定义 ExoPlayer MediaSource——从哪里开始?
【发布时间】:2019-05-13 15:01:56
【问题描述】:

我正在使用 ExoPlayer 创建一个自定义媒体播放器(我之前已经就同一主题提出了几个问题,因为我对 Android 开发非常陌生,而且似乎我遇到了每一行我写的代码)。

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

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

为此,我认为我需要创建一个自定义 MediaSource —— 但是我找不到任何好的文档或教程。 The ExoPlayer documentation on 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、提取内容并将数据传回是否更好。我还不确定这两个组件之间有什么区别,或者哪个更合适,并且缺少文档。

【问题讨论】:

  • "我的目标是将此 XML 文件作为视频源传递给 prepare(),调用 setPlayWhenReady(true),然后让所有内容按预期播放(网络 ID、内容和广告)"--为什么你认为这是View 的责任?恕我直言,下载和解析 XML 应该是存储库的责任,或者最坏的情况是视图模型。
  • 我们计划将我们的播放器作为库分发,供客户在他们自己的应用程序中使用。就像你现在可以实例化一个MediaPlayer,向它扔一个视频,它就像魔术一样——我希望人们能够实例化一个BFPlayer,向它扔一个视频,它就像魔术......还有一个额外的好处,那就是它会知道如何播放我们的内容。因此这个 XML 文件的解析应该是视频播放器的责任,而不是客户端的应用程序。

标签: android exoplayer exoplayer2.x


【解决方案1】:

因此,解析这个 XML 文件应该是视频播放器的责任,而不是客户端的应用程序。

因此,您实际上是在尝试创建一个新模式来为底层播放器分发视频(无论是什么,都要处理)。这似乎是客户端逻辑。但是,你想要一个答案,所以我会试着给你一个。

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

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

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

在您的场景中,您可能希望查看类似于使用 ParsingLoadable.Parser 的 DashManifestParser 的内容,其职责是解析您的输入模型。然后MediaSource 使用此ParsingLoadable.Parser 来获取播放所需的信息。

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

至于制作广告,可以通过多种方式完成:

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

所以。总结一下。

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

如果您想了解如何处理某些方面,我建议您查看我们的开源库,该库在后台使用 Exo-Player。我们甚至最近开始使用AdsLoader。 https://github.com/novoda/no-player

【讨论】:

  • 这绝对让我找到了一个好的方向。关于广告的一个快速问题 - 您的所有解决方案(切换内容、ConcatenatingMediaSource 和 AdsLoader)听起来都不允许同时解析广告和内容。这听起来会阻止我在广告中断期间接收来自内容的元数据事件。有没有办法让内容在后台“播放”,但静音且不显示任何内容,以便我可以继续接收元数据事件?
  • 抱歉,我不知道您所说的don't allow ads and content to be parsed simultaneously 是什么意思。如果您的意思是需要在播放器中单独加载它们,那么是的,您是正确的。如果您想处理广告,ConcatenatingMediaSource 将要求您交换曲目。您可以使用AdsLoader 来“同时”加载,但这并不完全是同时的,资产仅在播放器到达缓冲区中的某个点时才加载,例如广告开始前 10-20 秒。
  • “有没有办法让内容“正在播放”在后台,但静音且不显示任何内容,这样我就可以继续接收元数据” 你的意思是停止播放器?我并没有真正理解元数据事件的重点以及这些事件是如何来自内容的。
  • 我们的内容是 HLS 编码的,由三个流组成:视频流、音频流和定时元数据流 (ID3)。定时元数据流用于根据内容对广告进行定时(而不是在您开始观看 5 分钟后随机播放广告,我们可以等到动作暂停后再投放广告)。我们计划使用exoplayer.dev/doc/reference-v1/com/google/android/exoplayer/… 从内容中提取元数据
  • 在播放广告时收到与内容相关的元数据事件对我来说听起来很奇怪。更有意义的是pause 内容并播放广告,然后在广告完成后恢复内容。
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多