[英]Android: Sound overlaps when playing multiple audio files in a row
我正在嘗試連續播放多個音頻文件 。 我使用MediaPlayer class
來播放多個音頻文件。 但是,我無法弄清為什么在模擬器或手機上測試時聲音會重疊。 我的代碼的相關部分如下:
private MediaPlayer mPlayer1 = new MediaPlayer();
private MediaPlayer mPlayer2 = new MediaPlayer();
private AudioManager audioManager;
public void permissionGrantedActions() {
Uri uri1=Uri.parse("android.resource://com.android.packageName/" + mFile1);
try{mPlayer1.setDataSource(getActivity(), uri1);
}catch (IOException e) {
e.printStackTrace();
}
mPlayer1.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mPlayer1.prepareAsync();
mPlayer1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
AppLog.logString("Start Playing Sound1");
mPlayer1.start();
}
});
mPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mPlayer1.stop();
try {
mPlayer1.reset();
} catch (Exception e) {
e.printStackTrace();
}
mPlayer1.release();
AppLog.logString("Stop Playing Sound1");
}
});
mPlayer2.reset();
Uri uri2=Uri.parse("android.resource://com.android.packageName/" + mFile2);
try {
mPlayer2.setDataSource(getActivity(), uri2);
}catch (IOException e) {
e.printStackTrace();
}
mPlayer2.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mPlayer2.prepareAsync();
mPlayer2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
AppLog.logString("Start Playing Sound2");
mPlayer2.start();
}
});
mPlayer2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mPlayer2.stop();
try {
mPlayer2.reset();
} catch (Exception e) {
e.printStackTrace();
}
mPlayer2.release();
AppLog.logString("Stop Playing Sound2");
}
});
...
}
使用上述方法,聲音會重疊(每個音頻文件長約1秒,使用此代碼時,所有4個音頻文件將在1秒內播放...)。 知道為什么會這樣嗎?
好吧,MediaPlayer是異步的,您可以在這里看到mPlayer1.prepareAsync();
您需要做的是從以前的MediaPlayer的setOnCompletionListener
啟動它們。 像這樣:
//init here
mPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mPlayer1.stop();
try {
mPlayer1.reset();
mPlayer2.setOnPreparedListener(new
MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
AppLog.logString("Start Playing Sound2");
mPlayer2.start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
mPlayer1.release();
AppLog.logString("Stop Playing Sound1");
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.