按顺序播放声音,各声部之间没有延迟 [Android]



在我的Android应用程序中,我想按顺序播放一些以前被分成几部分的声音。每个部分都是一个 .wave 文件,长度为 2-3 秒。

我确实成功地执行了这项工作,但是在这些部分之间有明显的延迟。

我的代码现在看起来像这样 -

localMediaPlayer = new MediaPlayer[3];
localMediaPlayer[0] = MediaPlayer.create(this, R.raw.sound_1);
localMediaPlayer[1] = MediaPlayer.create(this, R.raw.sound_2);
localMediaPlayer[2] = MediaPlayer.create(this, R.raw.sound_3);

public void onClick_localBtn(View v){
    Toast.makeText(this, "Play Local Sound", Toast.LENGTH_LONG).show();
    localMediaPlayer[0].start();
    localMediaPlayer[0].setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        public void onCompletion(MediaPlayer mp) {
        localMediaPlayer[1].start();
        }
        });
    localMediaPlayer[1].setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        public void onCompletion(MediaPlayer mp) {
            localMediaPlayer[2].start();
        }
    });
}

我如何改进我的代码,使这些部分能够流畅且没有延迟地播放,就像它是 1 个文件的声音一样?

谢谢。

当您开始播放第 (N( 个媒体播放器时,请在第 (N+1( 个媒体播放器上调用prepareAsync()

localMediaPlayer[0].start();
localMediaPlayer[1].prepareAsync();
    localMediaPlayer[0].setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        public void onCompletion(MediaPlayer mp) {
        localMediaPlayer[1].start();
        localMediaPlayer[2].prepareAsync();
        }
        });
    localMediaPlayer[1].setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        public void onCompletion(MediaPlayer mp) {
            localMediaPlayer[2].start();
        }
    });

编辑

根据您的更新和评论,也许更好的方法是根据上一个播放器的持续时间减去一些增量来播放下一个媒体播放器:

private static final int DURATION_DELTA = 1000;
private Handler mHandler = new Handler();
public void playMediaPlayer(final int index) {
   if (index >= localMediaPlayer.length || localMediaPlayer[index] == null)
       return;

   localMediaPlayer[index].start();
   final int duration = localMediaPlayer[index].getDuration();
   mHandler.postDelayed(new Runnable() {
       @Override
       public void run() {
           playMediaPlayer(index + 1);
       }
   }, duration - DURATION_DELTA);
}

此代码基本上将播放媒体播放器,然后安排在下一个媒体播放器结束前大约 1 秒播放下一个媒体播放器。它有点"黑客",但你可以使用它(DURATION_DELTA的值(,直到你得到最好的结果。

最新更新