Java Android MediaPlayer有时会在同时播放两种声音时跳过或失败
我已经做了一个方法来播放mp3格式的声音,最大文件大小为145kb。当游戏中发生事件时,我只将文件发送到此方法。无论何时调用它,它都会创建一个新的mediaplayer实例,然后在完成时释放该实例。 我的问题是,在emulator和我的手机上,当我几乎同时播放两种声音时,声音要么像刮伤的CD一样跳过,要么一种声音根本不播放,或者有时它真的可以工作 线程是否过载了?我有三星galaxy s3。 我应该改用soundpool吗?我听说它也有自己的问题Java Android MediaPlayer有时会在同时播放两种声音时跳过或失败,java,android,audio,android-mediaplayer,Java,Android,Audio,Android Mediaplayer,我已经做了一个方法来播放mp3格式的声音,最大文件大小为145kb。当游戏中发生事件时,我只将文件发送到此方法。无论何时调用它,它都会创建一个新的mediaplayer实例,然后在完成时释放该实例。 我的问题是,在emulator和我的手机上,当我几乎同时播放两种声音时,声音要么像刮伤的CD一样跳过,要么一种声音根本不播放,或者有时它真的可以工作 线程是否过载了?我有三星galaxy s3。 我应该改用soundpool吗?我听说它也有自己的问题 public class MediaSimult
public class MediaSimultaneous {
private MediaPlayer[] mediaPlayerArray = new MediaPlayer[10];
private AudioManager mAudioManager;
int playerNum = -1; // Array index of the player instance.
public void playSound(Context context, int audioId) {
if (mAudioManager == null) {
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
playerNum += 1;
mediaPlayerArray[playerNum] = MediaPlayer.create(context, audioId);
mediaPlayerArray[playerNum].setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
mediaPlayerArray[playerNum] = null;
playerNum -= 1;
if (playerNum <= 0) {
playerNum = 0;
}
}
});
}
});
}
我发现这是两个不同的问题。口吃是由于mediaPlayer中有一个记录良好的bug造成的,有时根本不玩是由于没有被调用。此代码修复了该问题。我不知道具体怎么做。可能是因为媒体在onPreparedListener创建之前就已经准备好了
mediaPlayerArray[playerNum] = new MediaPlayer();
Uri mediaFile;
mediaFile = Uri.parse("android.resource://com.adventureapps.borntorun/" + audioId);
try {
mediaPlayerArray[playerNum].setDataSource(context, mediaFile);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayerArray[playerNum].setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayerArray[playerNum].setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp1) {
mp1.start();
Log.d(TAG, "mediaplayer " + Integer.toString(playerNum) + " started");
}
});
try {
mediaPlayerArray[playerNum].prepare();
} catch (IOException e) {
e.printStackTrace();
}
什么记录良好的bug?