2016-10-27 14 views
17

używam nowe funkcje z ExoPlayer 2.x grać listę plików audio tak:ExoPlayer 2 Playlist Listener

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

... 

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

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

to działa dobrze, ale aby zaktualizować UI odpowiednio, Muszę wiedzieć, która ścieżka jest aktualnie odtwarzana i postęp tego utworu. Czy jest jakiś słuchacz z ExoPlayera?

Dzięki!

+0

Czy kiedykolwiek otrzymałeś na to odpowiedź? Przyjęta odpowiedź nie pomaga, jak zauważono w komentarzach. –

Odpowiedz

4

Jestem więc w podobny scenariusz i musisz wiedzieć, kiedy rozpocznie się następny film z playlisty. Zauważyłem, że ExoPlayer.EventListener ma metodę o nazwie onPositionDiscontinuity(), która jest wywoływana za każdym razem, gdy wideo się zmienia lub "szuka" do następnej na liście odtwarzania.

Nie korzystałem z tej metody w szerokim zakresie, ale z tego, co widzę do tej pory, jest to metoda, którą należy się zainteresować. Nie ma żadnych parametrów, które zostaną przekazane, gdy metoda zostanie uruchomiona, więc będziesz musiał zachować jakiś licznik lub kolejkę, aby śledzić, co gra w danym momencie.

Mam nadzieję, że to pomoże!

Edit: zmiana indeksu zwróconej przez Exoplayer.getCurrentWindowIndex() jest recommended way wykryć zmianę pozycji na liście odtwarzania MediaSource.

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

, która to metoda jest również wywoływana podczas szybkiego przewijania do przodu lub do tyłu .. więc to nie działa dla mnie :(Potrzebuję detektora, który wystrzelił tylko wtedy, gdy rozpoczęło się nowe wideo B- ( – Kyk

+0

Co możesz spróbować to zawinięcie powyższego kodu do niestandardowej klasy ExoPlayer W tej klasie można zachować obiekty potrzebne do odtwarzania/szybkiego przewijania do przodu/do tyłu odtwarzanego wideo i wykonywać tylko akcje w metodzie onPositionDiscontinuity(), gdy wideo jest odtwarzane normalnie, oraz nie jest to szybkie przewijanie do przodu/do tyłu. Zasadniczo logiczne jest użycie metody onPositionDiscontinuity(), która sprawdza, czy wideo szybko przewija do przodu lub do tyłu, i postępuje tylko wtedy, gdy oba te przypadki są fałszywe. – rpm

7

Możesz zaimplementować następujące zdarzenie i zaktualizować swój interfejs użytkownika zgodnie ze stanem odtwarzacza.

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

Skąd mam wiedzieć, która ścieżka jest odtwarzana? – timoschloesser

+0

Jednym ze sposobów rozwiązania tego problemu jest zapisanie bieżącego utworu w pamięci podręcznej. Gdy zmienisz status gracza, możesz wystrzelić wydarzenie, aby pokazać bieżący utwór. –

+0

@DoronKakuli, ale 'onPositionDiscontinuity' jest wywoływane, gdy Exoplayer jest gotowy do odtwarzania utworu, a nie po kliknięciu następnego przycisku, a następnie jak obsługiwać i aktualizować interfejs użytkownika? – Gattsu

-1

Z mojej ograniczonej wiedzy

możesz spróbować dostać

MediaPlayer.TrackInfo 

MediaPlayer.TrackInfo Details toString() powinien dostać wam informacje potrzebne

+2

To jest niezwiązane z ExoPlayerem –

Powiązane problemy