如何实现oncompletionlistener来检测Exoplayer中媒体文件的结尾

时间:2014-12-08 05:13:07

标签: android exoplayer

我正在尝试以播放列表的形式一个接一个地播放视频。我使用Android Exoplayer来播放我的文件,但是媒体播放器中没有监听器可以收听媒体文件的末尾。有没有办法使用exoplayer监听媒体文件的结尾。

11 个答案:

答案 0 :(得分:29)

我知道这是旧的,但只是为了扩展已接受的答案:

exoPlayer.addListener(this);

.....

@Override
public void onPlayerStateChanged(boolean playWhenReady, int state) {

    if (state == ExoPlayer.STATE_ENDED){
        //player back ended
    }
}

答案 1 :(得分:24)

Exoplayer提供媒体播放器不提前实现。

在Android的Exoplayer的高级示例中,在 FullPlayerActivity.java 中,他们实施了 onStateChanged ,其中提供了 STATE_ENDED

您可以在{strong>相关样本

下的this page右侧部分下载示例

答案 2 :(得分:8)

您可以这样做:

playerExo.addListener(new ExoPlayer.Listener() {

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case ExoPlayer.STATE_BUFFERING:
                        break;
                    case ExoPlayer.STATE_ENDED:
                        //do what you want
                        break;
                    case ExoPlayer.STATE_IDLE:
                        break;
                    case ExoPlayer.STATE_PREPARING:
                        break;
                    case ExoPlayer.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onPlayWhenReadyCommitted() {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }
        });
        playerExo.seekTo(0);
        playerExo.setPlayWhenReady(true);

但@Murtaza Khursheed Hussain的回答是对的!有一个很好的代码日!如果您还需要其他东西,请告诉我们!

答案 3 :(得分:6)

Google已弃用ExoPlayer.STATE_ENDED,已替换为Player.STATE_ENDED

由于这篇文章已经有一段时间了,我将在下面写一个Kotlin版本的听众。

this.simpleExoPlayer?.addListener(object : Player.DefaultEventListener() {
            override fun onPlayerStateChanged(playWhenReady: Boolean,playbackState: Int) {
                when (playbackState) {
                    Player.STATE_IDLE -> {}
                    Player.STATE_BUFFERING -> {}
                    Player.STATE_READY -> {}
                    Player.STATE_ENDED -> {}
                }
            }
        })

答案 4 :(得分:6)

您必须实现接口 Player.EventLister ,并将其添加到exoPlayer中。

只需在方法 onPlayerStateChanged 上编写代码。查看代码。

exoPlayer.addListener( new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, @Nullable Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {

                switch(playbackState) {
                    case Player.STATE_BUFFERING:
                        break;
                    case Player.STATE_ENDED:
                        //Here you do what you want
                        break;
                    case Player.STATE_IDLE:
                        break;
                    case Player.STATE_READY:
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }


        });

答案 5 :(得分:2)

ExoPlayer.STATE_ENDED已弃用。请改用Player.STATE_ENDED。 例如:

@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
    if(playbackState == Player.STATE_ENDED){
        // your brain put here
    }
}

答案 6 :(得分:1)

对于未连接的MediaSource(代表您要播放的任何单个媒体),当媒体播放完毕时,您会收到 STATE_ENDED

对于ConcatenatingMediaSource,它发生在整个串联播放结束时(即您已播放到串联中最后一个项目的末尾)。因此,当整个MediaSource播放完毕时,就会出现STATE_ENDED。

对于ConcatenatingMediaSource,检测当前媒体结束和下一个媒体播放开始的最佳回调是“ onPositionDiscontinuity” 您应该使用 onPositionDiscontinuity()来确定何时发生过渡。请注意,在其他一些情况下也会调用onPositionDiscontinuity,但是您可以调用 getCurrentWindowIndex()并将其与您认为所在的窗口进行比较,以确定是否发生了过渡。您可以执行以下操作:

public void onPositionDiscontinuity() {
  int newIndex = player.getCurrentWindowIndex();
  if (newIndex != currentIndex) {
    // The index has changed ==> last media has ended and next media playback is started.
    currentIndex = newIndex;
  }
}

请注意::除非我们明确调用player.seekTo(position,0),否则不会为播放列表中的第一项调用onPositionDiscontinuity()。因此,要处理播放列表中所有媒体播放的所有操作,您必须分别处理播放列表中的第一项。

答案 7 :(得分:1)

由于 DefaultEventListeneronPlayerStateChanged() 已弃用。

使用 Player.EventListeneronPlaybackStateChanged()

Kotlin 代码

 player!!.addListener(object : Player.EventListener {
            override fun onPlaybackStateChanged(state: Int) {
                if (state == Player.STATE_ENDED) {
                    // your code here
                }
            }
        })

答案 8 :(得分:0)

我正在与exoplayer一起使用播放列表,我想在完成播放后停止播放媒体。

对我来说,当播放列表在我内部结束时,正在调用 Player.STATE_ENDED

所以要满足我的用例,我首先在exoplayer中设置了

 simpleExoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);

因此,我没有使用 EventListener ,而是使用了 AnalyticsListener ,它为 onPositionDiscontinuity 提供了eventTime参数的覆盖,并添加了一个简单的代码了解媒体是否已重新启动。

   @Override
   public void onPositionDiscontinuity(EventTime eventTime, int reason) {
        if (eventTime.currentPlaybackPositionMs / 1000 < 1) {
            exoPlayer.setPlayWhenReady(false);
            tvReplay.setVisibility(View.VISIBLE);
        }
    }

希望这对您的用例有帮助

答案 9 :(得分:0)

Google已弃用ExoPlayer.STATE_ENDED。请改用Player.STATE_ENDED。请参见下面的代码。

ALLOCATE(temp(3,2*n))
temp(:,1:n) = t2%elements(:,1:n)
CALL MOVE_ALLOC(to=t2%elements,from=temp)

您可以检查ExoPlayer Developer page以获得更多信息。

答案 10 :(得分:0)

使用这个

      exoPlayer.addListener(new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

            }

            @Override
            public void onLoadingChanged(boolean isLoading) {

            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == Player.STATE_ENDED) {

                  
                }
            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {

            }

            @Override
            public void onPositionDiscontinuity(int reason) {

            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }
        });