2017-05-24 8 views
0

Ich möchte einen Scrubber für ExoPlayer implementieren, um eine Miniaturansicht der Position anzuzeigen, die der Benutzer sucht. Während meine aktuelle Implementierung funktioniert, wird das Miniaturbild nur dann aktualisiert, wenn der Benutzer den Suchbereich nicht mehr gezogen oder für einen Moment angehalten hat. Es scheint, als ob der Suchbefehl auf dem ExoPlayer etwas wie eine Entprellfunktion implementiert, um zu viele Suchvorgänge nacheinander zu verhindern.Schnellsuche auf ExoPlayer

Während ich dies umgehen kann, indem ich meine eigenen Drosselung auf den Seekbar Callback und senden Sie eine Suchanforderung alle x Millisekunden, würde ich gerne wissen, ob es eine Möglichkeit, ExoPlayer zu sagen, keine Suchanfragen fallen lassen, so dass die Miniaturansicht kann Aktualisierung in Echtzeit.

als Referenz, das ist meine aktuelle Implementierung:

Betreff für die Drosselung:

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

Observer für mit Drosselung Anfragen suchen:

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

SeekBar Rückruf:

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

Antwort

0

Ich weiß nicht, ob dies die optimale Lösung ist, aber Sie können sich dieses Open-Source-Projekt ansehen, das ungefähr das erreicht, wonach Sie suchen. Here is the Github.

Es sieht so aus, als ob sie einen custom LoadControl verwenden, um den ExoPlayer dazu zu bringen, Frames schneller zu rendern. Und ich glaube, dass sie das mit der Auswahl der schlechtesten Qualität kombinieren, so dass es noch schneller lädt.

Dies ist der Code, den sie onProgressChange(...) in dieser Bibliothek verwenden:

@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); 
    } 
} 

Ein anderer Weg, dies zu tun ist eigentlich aus der TextureView eine Miniaturansicht greifen - was sie in this issue decken. Der Einschränkung, die da ist, gibt es einige Einschränkungen bei der Verwendung mehrerer Renderer.

+0

Danke für diese Zeiger. Die Suchleiste selbst wird nicht helfen, da das Problem im ExoPlayer selbst liegt, aber es kann gut sein, dass die benutzerdefinierte Ladesteuerung hier hilft, ich werde diesen Ansatz untersuchen. – Francesc

+0

Cool, lassen Sie mich wissen, wie Sie ausmachen, @Francesc. –

+0

Die Verwendung einer benutzerdefinierten Ladesteuerung, die den Player anweist, die Wiedergabe früher zu starten (nachdem nur 50ms Video gepuffert wurden), hat nicht geholfen. Es scheint immer noch ein Problem zu sein, dass der Spieler Suchanfragen entlarvt, es sieht so aus, als müsste ich in den Spielercode eintauchen, um herauszufinden, wie er mehrere Suchanfragen in schneller Folge bearbeitet. – Francesc