2016-10-27 30 views
17

私はこのようなオーディオファイルのリストを再生するにはExoPlayer 2.xからの新機能を使用しています:ExoPlayer 2プレイリストリスナー

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

... 

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

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

これは正常に動作しているが、それに応じて私のUIを更新するために、どの曲が現在演奏されているのか、この曲の進行状況を知る必要があります。 ExoPlayerのリスナーはありますか?

ありがとうございます!

+0

この回答をお持ちですか?コメントに記されているように、受け入れられた答えは役に立たない。 –

答えて

4

が必要な情報を取得する必要があり得ることを試みることができます再生リストの次の動画がいつ開始されるかを知る必要があります。私はExoPlayer.EventListeneronPositionDiscontinuity()というメソッドがあり、ビデオが変わるたびに呼び出されたり、プレイリストの次のものに「シーク」することがわかりました。

私はこの方法で広範囲に対処していませんが、私がこれまで見てきたことから、あなたが心配するべき方法です。メソッドが起動されたときに渡されるパラメータはありません。したがって、任意の瞬間に再生されているものを追跡するために、何らかの種類のカウンタまたはキューを保持する必要があります。

うまくいけば、これが役に立ちます。

編集:Exoplayer.getCurrentWindowIndex()によって返されたインデックス内の変更はプレイリストMediaSource内の項目の変化を検出するrecommended wayです。

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

とは無関係です。早送りや巻き戻しをするときに呼び出されるメソッドです。私にとってはうまくいきません:(新しいビデオが開始されたときにのみリスナーが必要です。( – Kyk

+0

試してみてくださいそのクラスでは、再生中のビデオの再生/早送り/巻き戻しに必要なオブジェクトを維持したり、ビデオが正常に再生されているときにのみonPositionDiscontinuity()メソッドでアクションを実行したりできます。早送り/巻戻しではなく、基本的にはビデオが早送りか巻き戻しかを確認するロジックをonPositionDiscontinuity()メソッドに持たせ、両方のケースがfalseの場合にのみ処理を進めます。 – rpm

7

次のイベントを実装して、プレーヤーの状態に応じてあなたのUIを更新することができます。

私の限られた知識で
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

どのトラックが再生されているのかをどのように知ることができますか? – timoschloesser

+0

これを処理する1つの方法は、現在の再生中の曲をキャッシュに保存することです。プレーヤーのステータスが変更されているときは、イベントを発生させて現在の曲を表示することができます。 –

+0

@DoronKakuliしかし、Exoplayerが曲を再生する準備ができたときに 'onPositionDiscontinuity'が呼び出されます。次のボタンがクリックされたときではなく、UIの処理方法や更新方法はありませんか? – Gattsu

関連する問題