如何解决Android ExoPlayer PlayList 在完成时暂停当前曲目
我的目标是在当前曲目完成后立即暂停,但播放列表播放的默认行为在整个播放列表完成后才会暂停。
我曾尝试使用 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
解决方法
您可以像这样使用 setPauseAtEndOfMediaItems
上可用的 SimpleExoplayer.Builder
方法:
player = SimpleExoPlayer.Builder(context)
.setPauseAtEndOfMediaItems(true)
.yourOtherOptions()
.build()
,
遗憾的是,没有直接回调可用于通知当前曲目的最后一帧结束。 ConcatenatingMediaSource 唯一可用的方法是onPositionDiscontinuity(),以了解轨道的结束,但正如您所知,只有在下一个轨道的第一帧已经呈现后才会分派。因此,在这种情况下,我认为我们可以针对您的用例提供以下可能性:
- 使用 VideoFrameMetadataListener 接口并覆盖 onVideoFrameAboutToBeRendered(),它将在视频帧即将呈现时在播放线程上调用。在您的情况下,就在下一个曲目渲染之前。 link
- 获取曲目持续时间 [getDuration()] 并使用 getCurrentPosition() 以每秒(或任何其他时间间隔)获取当前播放位置。并在返回指定时间时暂停播放。您可以为此使用 CountDownTimer,并在计时器回调 onTick() 中为当前曲目调用 getCurrentPosition()。
- 使用 PlayerMessage 在指定的播放位置触发事件:可以使用 PlayerMessage.setPosition 设置应该执行的播放位置。link
- 使用 onMediaItemTransition():在播放转换到另一个媒体项时调用。在这里,我们通常会为新的媒体项更新应用程序的 UI。因此,我们可以暂停播放,而不是更新 UI。不确定这是在 onPositionDiscontinuity() 之前还是之后调用的。需要验证可行性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。