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(),但如您所知,只有在下一轨道的第一帧已经呈现后才会调度.因此,在那种情况下,我认为我们可以根据您的用例得出以下可能性:
- 使用 VideoFrameMetadataListener 接口并覆盖 onVideoFrameAboutToBeRendered(),当视频帧即将播放时,将在播放线程上调用它被渲染。在您的情况下,就在下一个轨道渲染之前。 link
- 获取曲目持续时间 [getDuration()] 并保持每秒使用 getCurrentPosition() 获取当前播放位置(或任何其他时间间隔)。并在returns指定时间暂停播放。您可以为此使用 CountDownTimer,并在定时器回调中 onTick(),为当前曲目调用 getCurrentPosition()。
- 使用 PlayerMessage 在指定的播放位置触发事件:可以使用 PlayerMessage.setPosition.link[ 设置应该执行的播放位置。 =31=]
- 使用 onMediaItemTransition():当播放过渡到另一个媒体项时调用。在这里,我们通常会为新的媒体项更新应用程序的 UI。因此,我们可以暂停播放,而不是更新 UI。不确定这是否在 onPositionDiscontinuity() 之前或之后被调用。可行性有待验证。
您可以像这样使用 SimpleExoplayer.Builder
上可用的 setPauseAtEndOfMediaItems
方法:
player = SimpleExoPlayer.Builder(context)
.setPauseAtEndOfMediaItems(true)
.yourOtherOptions()
.build()
我的目标是在 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(),但如您所知,只有在下一轨道的第一帧已经呈现后才会调度.因此,在那种情况下,我认为我们可以根据您的用例得出以下可能性:
- 使用 VideoFrameMetadataListener 接口并覆盖 onVideoFrameAboutToBeRendered(),当视频帧即将播放时,将在播放线程上调用它被渲染。在您的情况下,就在下一个轨道渲染之前。 link
- 获取曲目持续时间 [getDuration()] 并保持每秒使用 getCurrentPosition() 获取当前播放位置(或任何其他时间间隔)。并在returns指定时间暂停播放。您可以为此使用 CountDownTimer,并在定时器回调中 onTick(),为当前曲目调用 getCurrentPosition()。
- 使用 PlayerMessage 在指定的播放位置触发事件:可以使用 PlayerMessage.setPosition.link[ 设置应该执行的播放位置。 =31=]
- 使用 onMediaItemTransition():当播放过渡到另一个媒体项时调用。在这里,我们通常会为新的媒体项更新应用程序的 UI。因此,我们可以暂停播放,而不是更新 UI。不确定这是否在 onPositionDiscontinuity() 之前或之后被调用。可行性有待验证。
您可以像这样使用 SimpleExoplayer.Builder
上可用的 setPauseAtEndOfMediaItems
方法:
player = SimpleExoPlayer.Builder(context)
.setPauseAtEndOfMediaItems(true)
.yourOtherOptions()
.build()