web-dev-qa-db-ja.com

ExoPlayer 2プレイリストリスナー

ExoPlayer 2.xの新機能を使用して、次のようなオーディオファイルのリストを再生しています。

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

...

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

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

これは正常に機能していますが、それに応じてUIを更新するには、現在再生中のトラックとこのトラックの進行状況を知る必要があります。 ExoPlayerからリスナーはいますか?

ありがとう!

23
timoschloesser

したがって、私は同様のシナリオにあり、プレイリストの次のビデオがいつ開始されるかを知る必要があります。 _ExoPlayer.EventListener_にはonPositionDiscontinuity()というメソッドがあり、ビデオが変更されるたびに、またはプレイリストの次へ「シーク」されるときに呼び出されます。

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

これがお役に立てば幸いです!

編集:Exoplayer.getCurrentWindowIndex()によって返されるインデックスの変更は 推奨される方法 プレイリスト内のアイテムの変更を検出する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;
                // ...
            }
        }
    });
_
11
raisedandglazed

次のイベントを実装し、プレーヤーの状態に応じて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();

            }
        });
8
DoronK