Слушатель Playlist 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);

Это работает нормально, но для того, чтобы обновить свой интерфейс, я должен знать, какой трек в данный момент играет, и ход этого трека. Есть ли прослушиватель ExoPlayer?

Спасибо!

Ответы

Ответ 1

Итак, у меня такой же сценарий, и мне нужно знать, когда начнется следующее видео в плейлисте. Я обнаружил, что 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;
                // ...
            }
        }
    });

Ответ 2

Вы можете реализовать следующее событие и обновить свой 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();

            }
        });

Ответ 3

С моими ограниченными знаниями

Можете ли вы попытаться получить

MediaPlayer.TrackInfo 

Сведения MediaPlayer.TrackInfo toString() должен предоставить вам необходимую вам информацию