我必须在背景中循环播放声音,没有任何间隙。我已经尝试了许多解决方案,例如
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
回调来帮助检查时间(如果有)。
或者,您可以尝试在onCompletion
回调中简单地调用seekTo(0)
,这应该比stop()/prepareAsync()
方法更快。但是,我认为这可能无法正常工作setNextMediaPlayer
因为它使MediaPlayer
处于已完成状态。(我不确定,因为我从未尝试过这个。
我不认为下一个MediaPlayer
会取消设置,因此我认为您不需要为每个实例调用setNextMediaPlayer
多次。但是,如果这样做,请使用onPrepared
回调让每个MediaPlayer
将另一个设置为下一个玩家。
2)使用一个MediaPlayer
,在onCompletion
回调中调用seekTo(0)
和start()
。我认为这就是播放器循环时发生的情况,但我不确定。可能值得一试。
3)学习OpenSL并在本机代码中实现自己的播放器。这种方法的研究强度要高得多,但提供了最大的控制:)