android 如何在recyclerview中重用ExoPlayer?

wf82jlnq  于 2023-04-28  发布在  Android
关注(0)|答案(3)|浏览(336)

我必须创建一个应用程序,屏幕上有视频对象,并且我必须在不打开新屏幕的情况下播放它们,从我所了解的情况来看,唯一的实现方法是在我的recyclerview内部添加exoplayer,这样做唯一的问题是,如果我必须为recyclerview中的每个项目创建一个新的exoplayer它的表现会非常糟糕,根本不会是可扩展的。有没有办法重用我的exoplayer,并将相同的示例给不同的playerviews?

093gszye

093gszye1#

唯一的问题是,如果我必须为recyclerview中的每个项目创建一个新的exoplayer,它的性能将非常糟糕,并且根本无法扩展。
你不应该使用超过一个exoplayer,大多数的android设备都有有限的硬件资源,虽然大多数的设备会为您提供超过2个硬件解码器,但有些设备只能提供单一的硬件解码器.所以你不应该依赖于创建多个exoplayer的想法.这里是一个exoplayer的维护者关于创建多个exoplayer的评论之一
有没有什么方法可以重用我的exoplayer,并将相同的示例赋予不同的playerviews
是的,有,所以这里的基本思想是。你使用一个单一的播放器视图和一个exoplayer。
用于在项目位置处播放视频。
1.您可以在recycler-view中获得要播放视频的项目位置。
1.将player-view附加到此物品位置。
1.隐藏此项目位置的缩略图。
1.根据项目位置更改exo-player的媒体项目。
1.播放视频。
现在播放视频在一些其他的位置在recycler-view
1.停止播放器播放。
1.隐藏播放器视图从以前播放的项目的位置。
1.显示先前播放项目位置的缩略图。
1.重复上述所有步骤,在此新位置播放视频。
您可以通过实现自定义Recycler视图来实现这一点,在那里您可以轻松地获得滚动位置,屏幕上的项目数量,项目高度以及实现此方法所需的所有其他属性。
下面是这个自定义回收器视图实现的Github Repo,您也可以观看这个自定义回收器视图实现的this video

oxiaedzo

oxiaedzo2#

还有其他方法可以做到这一点,但这里有一个例子,使用此页面上提供的信息:https://exoplayer.dev/ui-components.html
如果你想同时播放视频对象,我猜你需要多个exoplayer示例,但是我假设你会使用某种滚动事件来确定一个视频何时停止,另一个视频何时开始(例如最中心的视频)。如果是这种情况,你可以通过以下方式来完成:

  • 让你的exoplayer示例被拥有你的recyclerview的同一个东西拥有(这样它们就有相同的对象生存期)
  • 每个recyclerview单元格都有一个StyledPlayerView或类似的视图
  • 让所属对象监视回收器视图当前滚动位置,并确定一个单元格何时停止播放,下一个单元格何时开始播放(或者让回收器视图在播放的内容需要更改时发出事件)。
  • 停止当前项目的播放,并在当前正在播放的StyledPlayerView上调用setPlayer(null
  • 找到将要执行下一个播放操作的StyledPlayerView,并在其上调用setPlayer(yourExoPlayerInstance)
  • 再次准备/启动exoplayer。

你可能想考虑使用两个exoplayer示例来进行某种转换/切换,以及如果用户以某种方式抛出列表,会有什么行为。

9jyewag0

9jyewag03#

Praveen的答案很好,但我不建议你使用非官方的库,特别是在应用程序的发布中。只需将当前播放的项目在视图模型中的位置保存为实时数据,并将此实时数据传递给具有生命周期所有者的RV适配器构造函数。接下来在ViewHolder绑定函数中观察项目ID并与当前项目ID进行比较。如果匹配-将播放器附加到视图,如果不匹配-查看缩略图并隐藏播放器。设置为playerView空值。当点击播放按钮时,只需将新项目ID和播放播放器传递给livedata,同时livedata观察者更新您的播放器或缩略图可见性。

相关问题