2016-10-27 7 views
17

ich die neuen Funktionen von ExoPlayer 2.x eine Liste von Audio-Dateien wie diese zu spielen:ExoPlayer 2 Play Listener

List<MediaSource> playlist = new ArrayList<>(); 

... 

ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(
      playlist.toArray(new MediaSource[playlist.size()])); 

mExoPlayer.prepare(concatenatedSource); 
mExoPlayer.setPlayWhenReady(true); 

Dies funktioniert gut, aber um meine UI entsprechend zu aktualisieren, Ich muss wissen, welcher Track gerade spielt und wie weit dieser Track fortgeschritten ist. Gibt es einen Hörer von ExoPlayer?

Danke!

+0

Haben Sie jemals eine Antwort darauf erhalten? Die angenommene Antwort hilft nicht, wie in den Kommentaren angemerkt. –

Antwort

4

brauchen So bin ich in ähnlich einem Szenario und müssen wissen, wann das nächste Video in der Wiedergabeliste gestartet wird. Ich habe festgestellt, dass die ExoPlayer.EventListener eine Methode namens onPositionDiscontinuity() hat, die jedes Mal aufgerufen wird, wenn das Video in der Wiedergabeliste wechselt oder "sucht".

Ich habe nicht mit dieser Methode ausgiebig herumgespielt, aber von dem, was ich bis jetzt sehen kann, ist dies die Methode, um die Sie besorgt sein sollten. Es gibt keine Parameter, die beim Abfeuern der Methode übergeben werden. Daher müssen Sie eine Art Zähler oder Warteschlange behalten, um zu verfolgen, was gerade gespielt wird.

Hoffentlich hilft das!

Edit: Änderung des Brechungsindex zurück von Exoplayer.getCurrentWindowIndex() ist die recommended way Artikel Änderung in einer Wiedergabeliste MediaSource zu erkennen.

int lastWindowIndex = 0; // global var in your class encapsulating exoplayer obj (Activity, etc.) 

exoPlayer.addListener(new ExoPlayer.EventListener() { 
     @Override 
     public void onLoadingChanged(boolean isLoading) { 
     } 

     @Override 
     public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 
     } 

     @Override 
     public void onTimelineChanged(Timeline timeline, Object manifest) { 
     } 

     @Override 
     public void onPlayerError(ExoPlaybackException error) { 
     } 

     @Override 
     public void onPositionDiscontinuity() { 
      //THIS METHOD GETS CALLED FOR EVERY NEW SOURCE THAT IS PLAYED 
      int latestWindowIndex = exoPlayer.getCurrentWindowIndex(); 
      if (latestWindowIndex != lastWindowIndex) { 
       // item selected in playlist has changed, handle here 
       lastWindowIndex = latestWindowIndex; 
       // ... 
      } 
     } 
    }); 
+0

diese Methode auch aufgerufen, wenn Sie fastforward oder zurückspulen .. so funktioniert es nicht für mich :(Ich brauche einen Listener, der nur ausgelöst, wenn ein neues Video gestartet B- ( – Kyk

+0

Was Sie versuchen könnten ist Einfügen des obigen Codes in eine benutzerdefinierte ExoPlayer-Klasse In dieser Klasse können Sie die Objekte verwalten, die zum Abspielen/schnellen Vorspulen/Zurückspulen des Videos benötigt werden, und nur Aktionen in der onPositionDiscontinuity() -Methode ausführen, wenn das Video normal abgespielt wird Es gibt keine Logik für die onPositionDiscontinuity() -Methode, die prüft, ob das Video vor- oder zurückgespult wird, und nur fortfahren, wenn beide Fälle falsch sind. – rpm

7

Sie können das folgende Ereignis implementieren und Ihr ui je nach Status des Players aktualisieren.

mExoPlayer.addListener(new ExoPlayer.Listener() { 
      @Override 
      public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 
       if (playbackState == PlaybackStateCompat.STATE_PLAYING) { 
        //do something     
       } 
      } 

      @Override 
      public void onPlayWhenReadyCommitted() { 

      } 

      @Override 
      public void onPlayerError(ExoPlaybackException error) { 
       mExoPlayer.stop(); 

      } 
     }); 
+0

Woher weiß ich, welcher Track gerade abgespielt wird? – timoschloesser

+0

Eine Möglichkeit, dies zu umgehen, ist das Speichern des aktuell wiedergegebenen Songs im Cache. Wenn der Playerstatus geändert wird, können Sie ein Ereignis auslösen, um den aktuellen Titel anzuzeigen. –

+0

@DoronKakui aber 'onPositionDiscontinuity' wird aufgerufen, wenn der Exoplayer bereit ist, den Song abzuspielen, nicht wenn der nächste Button geklickt wird, dann wie man mit UI umgeht? – Gattsu

-1

Mit meinem begrenzten Wissen

Können Sie versuchen

MediaPlayer.TrackInfo 

MediaPlayer.TrackInfo Details toString() zu erhalten, sollten Sie die Informationen erhalten, die Sie

+2

Dies ist nicht verwandt mit ExoPlayer –