当 ExoPlayer 到达 STATE_ENDED 时如何播放歌曲

问题描述 投票:0回答:1

我正在实现一种音乐算法,其中包括等待 ExoPlayer 完成播放,然后将一首歌曲附加到播放列表的末尾,并从该歌曲开始播放列表。

作为概念证明,我尝试在播放器完成时通过发送命令来重复一首歌曲(我不是尝试使用 ExoPlayer 的循环单曲功能;如果您认为我是,请再次阅读第一段) 。我认为当玩家到达 STATE_ENDED 时可以完成此操作,但是,我发送给玩家的命令都没有被发送。

这是代码

    private val listener = object : Player.Listener {

        override fun onPlaybackStateChanged(playbackState: Int) {
            super.onPlaybackStateChanged(playbackState)
            if(playbackState == STATE_ENDED){
                playerHolder.getPlayer().seekToPreviousMediaItem()
                playerHolder.getPlayer().prepare()
                playerHolder.play()
            }
        }

    }

我也尝试过这个:

        override fun onPlaybackStateChanged(playbackState: Int) {
            super.onPlaybackStateChanged(playbackState)
            if(playbackState == STATE_ENDED){
                Handler(playerHolder.getPlayer().applicationLooper).post {
                    playerHolder.getPlayer().seekToPreviousMediaItem()
                    playerHolder.getPlayer().prepare()
                    playerHolder.play()
                }
            }
        }

我已经验证,当播放器的播放状态发生变化时,这段代码会运行,调试器使用断点,单步执行,当播放状态为 STATE_ENDED 时,所有行都会被执行。

此片段的目标是播放刚刚结束的歌曲。这是我尝试实现的算法的概念证明,但它不起作用。

当状态达到 STATE_ENDED 时,如何向 ExoPlayer 发送命令?

顺便说一句,我在 UI 中有一个按钮,可以通过控制器发送命令,当歌曲结束并且用户按下该按钮时,同一首歌曲会再次播放,所以这似乎是可能的。

android androidx exoplayer android-media3
1个回答
0
投票

为了概念证明,以下代码似乎可以工作,但可能并不理想,但我找不到其他方法。

        override fun onPlaybackStateChanged(playbackState: Int) {
            super.onPlaybackStateChanged(playbackState)
            if (playbackState == STATE_ENDED) {
                playerHolder.getPlayer().setMediaItems(
                    listOf(playerHolder.getPlayer().currentMediaItem!!)
                )
                playerHolder.getPlayer().play()
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.