Exoplayer - 你可以在缓冲时调用seekTo()吗?

时间:2017-01-23 14:23:23

标签: android exoplayer

我有一个ExoPlayer实例和一个搜索栏。当用户搜索时,我想使用ExoPlayer.seekTo()来更新视频的位置。

您是否可以根据需要随时拨打ExoPlayer.seekTo(),如果尚未完成,它应该处理取消之前的seekTo()次请求?或者我们是否必须阻止自己过度调整seekTo()

由于

1 个答案:

答案 0 :(得分:1)

  

您可以根据需要随时调用ExoPlayer.seekTo()吗,如果尚未完成,它应该处理取消之前的seekTo()请求吗?或者我们是否必须自己防止过度搜索seekTo()?

我想你可以。

取消之前的搜索请求。 实际上,在搜索过程中至少涉及三个线程。 enter image description here

  1. 应用程序线程:它是您调用ExoPlayer.seekTo()的线程。
  2. 内部回放线程:设置目标位置和线程的线程。在内部对EXOplayer进行内部设置; as seekToInternal(),seekToPeriodPosition()和seekToPeriodPosition()......类ExoPlayerImplInternal。
  3. 加载线程:你可以在load.java中找到它。当步骤2内部回放线程完成设置时,它调用continueLoading()使加载线程下载搜索目标周围的目标数据。
  4. 一旦内部回放线程完成了搜索动作的处理,它就可以安排 doSomeWork 的动作,该动作试图查看是否有要渲染(或跳过)的解码帧。 最后,当渲染搜索目标时,您可以看到显示的搜索目标的时刻。

    简而言之,一旦先前的搜索操作(例如ExoPlayer.seekTo())已将相应的消息发送到internalPlaybackThread的消息队列,您可以再次按下(传递)下一个搜索。搜索操作是序列化,并由内部回放线程按顺序处理。

    一旦内部回放线程检索到寻道消息&处理了它。加载线程开始加载。如果你下载,demux&解码速度足够快以及在下一次搜索之前有一个doSomeWork,你可以看到搜索结果。 否则,下一次搜索将停止加载&再次寻求(在这种情况下,看起来好像先前的搜索是 取消 )。

    结果,它取决于您在内部提供连续搜索操作和执行顺序的速度。