繁体   English   中英

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

[英]Android MediaPlayer sometimes skips or fails when playing two sounds simultaneously

我已经制定了一种以mp3格式播放声音的方法(最大文件大小为145kb)。 当游戏中发生事件时,我只是将文件发送到此方法。 每当调用它时,它将创建一个新的mediaplayer实例,然后在完成时释放该实例。 我的问题是,在模拟器和手机上,当我同时播放2种声音时,这些声音要么跳过(如刮擦的CD),要么根本不播放一种声音,或者有时它确实起作用。

线程过载了吗? 我有一个三星银河s3。 我应该改用Soundpool吗? 我听说它有自己的问题

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,有时根本无法播放是由于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();
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM