簡體   English   中英

Android:連續播放多個音頻文件時聲音重疊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM