Android - 如何删除MediaPlayer循环延迟?

时间:2016-05-28 13:52:07

标签: android android-mediaplayer delay

我为我的游戏设置了一个音乐文件循环播放MediaPlayer,但是当它循环时会导致2秒的延迟。

我的代码:

boolean activateSounds = getIntent().getBooleanExtra("Activate sounds", true);

    if(mp!=null){
        mp.reset();
        mp.release();
    }
    mp = MediaPlayer.create(StartGame.this, R.raw.music1);
    mp.setVolume(8f, 8f);
    mp.setLooping(true); // This is causing delays
    if (activateSounds) mp.start();

对于游戏来说,这并不有趣。有没有办法让MediaPlayer用完循环延迟?

1 个答案:

答案 0 :(得分:1)

我无法在没有间隙的情况下进行setLooping工作。

只有对我有用的解决方案是使用setNextMediaPlayer调用(能够无间隙地启动下一个循环)和两个MediaPlayers。

'伪'代码:

class Abc implements MediaPlayer.OnCompletionListener {

private final MediaPlayer[] mps = new MediaPlayer[2];

public Abc() {
    mps[0] = new MediaPlayer();
    mps[1] = new MediaPlayer();
    mps[0].setOnCompletionListener(this);
    mps[1].setOnCompletionListener(this);
}

public void start()
    initMediaPlayer(mps[0]);
    initMediaPlayer(mps[1]);

    mps[0].setNextMediaPlayer(mps[1]);
    mps[0].start();
}

private void initMediaPlayer(MediaPlayer mp)
{
    if (mp.isPlaying()){
            mp.stop();
    }
    mp.reset();

    final float volume = 0.07f;

    mp.setDataSource(MY_SOURCE);
    mp.setVolume(volume, volume);
    mp.setLooping(false);

    try {
        mp.prepare();
    }catch(Exception error){
        Log.d("BackgroundMusic", error.toString());
    }
}

@Override
public void onCompletion(MediaPlayer mp)
{
    MediaPlayer cur = mps[0] == mp ? mps[1] : mps[0];

    initMediaPlayer(mp);
    cur.setNextMediaPlayer(mp);
}

}