媒体播放器设置下一个播放器



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

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并在本机代码中实现自己的播放器。这种方法的研究强度要高得多,但提供了最大的控制:)

最新更新