4

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

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();
        }

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

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

4

1 回答 1

3

几个想法:

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

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

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

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

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

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

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

3) 学习 OpenSL 并用本机代码实现自己的播放器。这种方法的研究更加密集,但提供了最大的控制:)

于 2013-11-14T02:39:26.183 回答