我必须在没有任何间隙的背景下循环播放声音。
我尝试了很多解决方案,例如

SoundPool (-1 for loop)
AudioTrack
Mediaplayer

但没有找到任何最佳解决方案

现在我已经实现了
setNextMediaPlayer()

像这样
        public void createDefaultPlayer()
        {
            defaultBgSound1 = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier("raw/" + file, "raw", getPackageName()));
            defaultBgSound2 = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier("raw/" + file, "raw", getPackageName()));
            defaultBgSound1.setNextMediaPlayer(defaultBgSound2);
            defaultBgSound1.start();
        }

它播放下一个声音,但我想永远继续这个循环

任何最好的方法来循环这个

最佳答案

几个想法:

1)这就是我认为您的建议可以起作用的方式:

通过准备两个具有相同媒体的 MediaPlayer 实例,完全按照您的方式开始。

在每个传递另一个作为参数时调用 setNextMediaPlayer

在每个的 onCompletion 回调中,让它自己调用 stop()prepareAsync()。这应该将它返回到准备好的状态,我相信这是 setNextMediaPlayer 机制所期望的。如果声音是本地资源并且持续时间足够长,那么这种方法应该没有问题,尽管您可以使用 onPrepared 回调来帮助检查时间(如果有的话)。

或者,您可以尝试在 seekTo(0) 回调中简单地调用 onCompletion,这应该比 stop()/prepareAsync() 方法更快。但是,我认为 setNextMediaPlayer 可能无法正常工作,因为它使 MediaPlayer 处于完成状态。 (我不确定,因为我从未尝试过。)

我认为下一个 MediaPlayer 不会被取消设置,因此我认为每个实例不需要多次调用 setNextMediaPlayer。但是如果你这样做了,使用 onPrepared 回调让每个 MediaPlayer 将另一个设置为它的下一个玩家。

2)使用一个MediaPlayer,在seekTo(0)回调中调用start()onCompletion。我认为这是播放器循环时会发生的情况,但我不确定。这可能值得一试。

3) 学习 OpenSL 并在 native 代码中实现您自己的播放器。这种方法的研究密集得多,但提供了最大的控制:)

10-07 19:17
查看更多