2017-01-23 37 views
0

我有一個ExoPlayer實例和一個seekbar。當用戶尋求時,我想用ExoPlayer.seekTo()來更新視頻的位置。Exoplayer - 你可以在緩衝時調用seekTo()嗎?

您是否可以根據需要頻繁撥打ExoPlayer.seekTo(),並且如果他們還沒有完成,它應該處理取消先前的seekTo()請求?或者我們是否必須防止過度打電話seekTo()自己?

感謝

回答

0

你可以調用ExoPlayer.seekTo()一樣頻繁只要你想,它應該處理並取消以前seekTo()請求,如果他們還沒有完成?或者,我們是否必須防止overTopping seekTo()調用自己?

我認爲你可以。

它將取消先前的尋找請求。實際上,至少有三個線程涉及查找過程。 enter image description here

  1. 應用程序線程:這就是你所謂ExoPlayer.seekTo線程()。
  2. 內部播放螺紋:它是線程來設置目標位置&做內部設置,以在內部EXOplayer;作爲類ExoPlayerImplInternal的seekToInternal(),seekToPeriodPosition()和seekToPeriodPosition()...等等。
  3. 加載線程:你可以在load.java中找到它。當第2步的內部回放線程完成設置時,它會調用continueLoading()讓加載線程下載搜索目標周圍的目標數據。

一旦內部播放線程已經做了尋找動作的處理,也可以安排doSomeWork這個動作的嘗試看看是否有被渲染(或跳過)解碼幀。 最後,當查找目標被渲染時,您可以看到顯示屏上顯示的查找目標的時刻。

總之,先前的查找操作(例如ExoPlayer.seekTo())已將相應的消息發送到internalPlaybackThread的消息隊列後,您可以再次按下(遞送)下一個查找。查找操作是序列化並按內部播放線程順序處理。

一旦內部播放螺紋檢索求消息&已處理它。加載線程開始加載。如果您下載,demux &解碼速度足夠快,並且在下一次搜索前有一個doSomeWork,您可以看到搜索結果。 否則,下一次查找將停止加載&再次查找(在這種情況下,它看起來好像前一個查找是取消)。

結果,這取決於如何快速您提供一個連續的尋找動作和內部的執行順序。

相關問題