【问题标题】:Android MediaPlayer sometimes skips or fails when playing two sounds simultaneouslyAndroid MediaPlayer 在同时播放两种声音时有时会跳过或失败
【发布时间】:2015-12-31 09:06:22
【问题描述】:

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

是线程超载还是什么?我有三星 Galaxy 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;

                        }
                    }
                });
            }
        });

}

【问题讨论】:

    标签: java android audio android-mediaplayer


    【解决方案1】:

    我发现这是两个不同的问题。口吃是由于 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();
            }
    

    【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多