ExoPlayer 2播放列表监听器

tim*_*ser 23 android exoplayer

我正在使用ExoPlayer 2.x的新功能来播放这样的音频文件列表:

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

...

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

mExoPlayer.prepare(concatenatedSource);
mExoPlayer.setPlayWhenReady(true);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但为了相应地更新我的UI,我需要知道当前正在播放哪首曲目以及该曲目的进度.ExoPlayer有没有听众?

谢谢!

rai*_*zed 11

所以我处于类似的情况,需要知道播放列表中的下一个视频何时开始.我发现每次视频改变或"寻找"到播放列表中的下一个时,都会调用一个被调用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;
                // ...
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)


Dor*_*onK 8

您可以根据玩家的状态实施以下事件并更新您的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();

            }
        });
Run Code Online (Sandbox Code Playgroud)