2016-05-28 67 views
0

我爲我的遊戲設置了一個音樂文件以在MediaPlayer上循環播放,但它在循環播放時會導致2秒的延遲。Android - 如何清除MediaPlayer循環延遲?

我的代碼:

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

我不能沒有差距地進行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); 
} 

}