如何在 recyclerview 中重用 ExoPlayer?

How to reuse an ExoPlayer inside a recyclerview?

我必须创建一个屏幕上有视频对象的应用程序,并且我必须在不打开新屏幕的情况下播放它们。据我了解,唯一的实现方法是在我的 recyclerview 中添加 exoplayer。唯一的问题是,如果我必须为 recyclerview 中的每个项目创建一个新的 exoplayer,它的性能会很差并且根本无法扩展。有什么方法可以重用我的 exoplayer 并为不同的播放器视图提供相同的实例吗?

还有其他方法可以做到这一点,但这里有一个使用此页面上提供的信息的示例: https://exoplayer.dev/ui-components.html

如果您希望视频对象同时播放,我想您将需要多个 exoplayer 实例,但我假设您将使用某种滚动事件来确定一个视频何时停止以及另一个视频何时开始(例如最重要的视频)。如果是这种情况,您可以通过以下方式完成:

  • 让您的 exoplayer 实例与拥有您的 recyclerview 的对象相同(这样它们就有相同的对象生命周期)
  • 您的每个 recyclerview 单元格都会有一个 StyledPlayerView 或类似的
  • 让拥有对象监视回收器视图当前滚动位置并确定一个单元格何时停止播放和下一次开始(或者让回收器视图在播放的内容需要更改时发出事件)。
  • 停止当前项目的播放并在当前正在播放的 StyledPlayerView 上调用 setPlayer(null)
  • 找到将要执行下一段播放的 StyledPlayerView 并在其上调用 setPlayer(yourExoPlayerInstance)
  • Prepare/Start exoplayer 又来了。

您可能想考虑使用两个 exoplayer 实例来执行某种操作 transition/handover 以及如果用户以一种或另一种方式滑动列表时会发生什么行为。

The only problem with this is that if I have to create a new exoplayer for each item in the recyclerview, it would perform very bad and will not be scalable at all.

你不应该使用超过一个 exoplayer,大多数 android 设备的硬件资源有限,虽然大多数设备会为你提供超过 2 个硬件解码器,但有些设备只能仅提供单个硬件解码器。所以你永远不应该依赖创建多个 exoplayer 的想法。 Here's a comment from one of the maintainer of the exoplayer about creating multiple exoplayers

Is there any way to reuse my exoplayer and give the same instance to different playerviews

是的,这里的基本思想是。您使用单个播放器视图和一个外部播放器。

用于在项目位置播放视频。

  1. 您获得了要播放视频的回收站视图中的项目位置。
  2. 将播放器视图附加到该项目位置。
  3. 隐藏该项目位置的缩略图。
  4. 根据项目位置更改 exo-player 的媒体项目。
  5. 播放视频。

现在可以在 recycler-view 的其他位置播放视频

  1. 停止 exoplayer 播放。
  2. 从之前播放的项目位置隐藏播放器视图。
  3. 显示上一个播放项目位置的缩略图。
  4. 重复之前的所有步骤以在此新位置播放视频。

您可以通过实现自定义 Recycler-view 来实现这一点,您可以在其中轻松获取滚动位置、屏幕上的项目数、项目高度以及实现此方法所需的所有其他属性。

这是此自定义回收器视图实现的Github Repo with this custom recycler-view implementation, You can also watch this video