2017-05-24 76 views
0

我想爲ExoPlayer實施一個清理程序,以顯示用戶正在尋找的位置的縮略圖預覽。雖然我目前的實施工作正在進行,但縮略圖僅在用戶停止拖動seekbar視圖或暫停一會之後刷新。看起來好像ExoPlayer上的seek命令正在實現類似debounce功能的東西,以防止連續搜索太多搜索。在ExoPlayer上快速查找

雖然我可以通過在seekbar回調中自行調節並每隔x毫秒發送一次查找請求來解決此問題,但我想知道是否有方法可以告訴ExoPlayer不要刪除查找請求,以便縮略圖可以實時更新。

供參考,這是我目前的執行:

主題節流:

private final Subject<Long> subject = PublishSubject.create(); 

觀察員尋求與節流請求:

subject 
     .throttleLast(400L, TimeUnit.MILLISECONDS) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(position -> exoPlayer.seekTo(position)); 

搜索欄回調:

@Override 
public void onProgressChanged(@NonNull final SeekBar seekBar, 
           final int progress, 
           final boolean fromUser) { 
    if (fromUser) { 
     final long position = computePosition(progress); 
     subject.onNext(position); 
    } 
} 

回答

0

我不知道這是否是最佳解決方案,但您可以看看這個開源項目,它大致可以實現您正在尋找的功能。 Here is the Github

看起來他們使用custom LoadControl讓ExoPlayer更快地渲染幀。我相信他們會選擇質量最差的產品,這樣它的載入速度會更快。

這是他們在該庫的onProgressChange(...)使用代碼:

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if(fromUser){ 
     int offset = (float) progress/seekBar.getMax() 
     // Round the offset before seeking. The sample uses 1% or 10% of the video per each thumbnail 
     previewPlayer.seekTo((long) (offset * previewPlayer.getDuration())); 
     previewPlayer.setPlayWhenReady(false); 
    } 
} 

另一種方式做,這是真正抓住縮略圖關閉TextureView的 - 他們在this issue覆蓋。在使用多個渲染器時需要注意的一些限制。

+0

感謝您的指點。 seekbar本身不會幫助,因爲問題在ExoPlayer本身內,但很可能是自定義加載控制在這裏有幫助,我會調查該方法。 – Francesc

+0

很酷,讓我知道你是怎麼做出來的,@Francesc。 –

+0

使用指示播放器更快開始播放的自定義負載控制(僅緩衝了50ms的視頻後)沒有幫助。玩家反彈尋求請求似乎仍然是一個問題,看起來我必須深入研究玩家代碼以瞭解它如何快速連續地處理多個查找請求。 – Francesc