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

时间:2017-02-08 09:42:05

标签: android audio android-mediaplayer

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

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

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

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档声音一样?

感谢。

1 个答案:

答案 0 :(得分:0)

当您开始播放第(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秒。它有点" hacky",但你可以玩它(DURATION_DELTA的值),直到你得到最好的结果。