我必须在没有任何间隙的背景下循环播放声音。
我尝试了很多解决方案,例如
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 代码中实现您自己的播放器。这种方法的研究密集得多,但提供了最大的控制:)