当同时播放两种声音时,Android MediaPlayer有时会跳过或失败



我做了一个方法来播放mp3格式的声音(最大文件大小145kb)。当游戏中发生事件时,我只需将文件发送给这个方法。每当它被调用时,它都会创建一个新的mediaplayer实例,然后在完成时释放该实例。我的问题是,这两个模拟器和我的手机,当我播放2个声音几乎同时,声音要么跳过(像刮伤CD),或者一个声音不播放,或者有时它实际上工作。

是线程过载还是什么?我用的是三星galaxy s3。我应该使用声池吗?我听说它有它自己的问题

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中一个有充分记录的错误,有时根本不播放是由于没有调用onPrepared。这段代码解决了这个问题。我不确定具体是怎么回事。可能是因为媒体在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();
        }

最新更新