Android ExoPlayer 播放列表完成后暂停当前曲目

Android ExoPlayer PlayList Pause Current Track When It Finishes

我的目标是在 Current 曲目结束后立即暂停,但播放列表播放的默认行为不会暂停,直到整个 Playlist[=23] =]完成。

我试过使用 onPositionDiscontinuity() 但是在曲目切换到下一曲目后调用它。

override fun onPositionDiscontinuity(reason: Int) {
    super.onPositionDiscontinuity(reason)

    if (reason == SimpleExoPlayer.DISCONTINUITY_REASON_PERIOD_TRANSITION) {
        Log.v("xxx", "called!")    //not called at the end of current track
    }
}

而且似乎不支持本地(官方): https://github.com/google/ExoPlayer/issues/3773

遗憾的是,没有直接回调通知当前轨道的最后一帧结束。 ConcatenatingMediaSource 唯一可用于知道轨道结束的是 onPositionDiscontinuity(),但如您所知,只有在下一轨道的第一帧已经呈现后才会调度.因此,在那种情况下,我认为我们可以根据您的用例得出以下可能性:

  1. 使用 VideoFrameMetadataListener 接口并覆盖 onVideoFrameAboutToBeRendered(),当视频帧即将播放时,将在播放线程上调用它被渲染。在您的情况下,就在下一个轨道渲染之前。 link
  2. 获取曲目持续时间 [getDuration()] 并保持每秒使用 getCurrentPosition() 获取当前播放位置(或任何其他时间间隔)。并在returns指定时间暂停播放。您可以为此使用 CountDownTimer,并在定时器回调中 onTick(),为当前曲目调用 getCurrentPosition()。
  3. 使用 PlayerMessage 在指定的播放位置触发事件:可以使用 PlayerMessage.setPosition.link[ 设置应该执行的播放位置。 =31=]
  4. 使用 onMediaItemTransition():当播放过渡到另一个媒体项时调用。在这里,我们通常会为新的媒体项更新应用程序的 UI。因此,我们可以暂停播放,而不是更新 UI。不确定这是否在 onPositionDiscontinuity() 之前或之后被调用。可行性有待验证。

您可以像这样使用 SimpleExoplayer.Builder 上可用的 setPauseAtEndOfMediaItems 方法:

player = SimpleExoPlayer.Builder(context)
            .setPauseAtEndOfMediaItems(true)
            .yourOtherOptions()
            .build()