你如何在Java中顺序播放音频文件?

时间:2015-01-10 22:02:46

标签: java android audio android-mediaplayer

因此,对于我正在开发的应用程序,我有一堆音频文件,根据某些变量的状态,可能会或可能不会播放(并且它们播放的顺序也会发生变化)。

我理解setOnCompletionListener的基础知识,但我无法找出使用它的最佳方法。目前,如果我想播放audio1,audio2,audio3,我的代码设置如下:

 clipSetup(1);
 aP.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
      @Override
      public void onCompletion(MediaPlayer mp){
           clipSetup(2);
           aP.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
                @Override
                public void onCompletion(MediaPlayer mp){
                    clipSetup(3);
                }
           });
      }
 });

 private MediaPlayer clipSetup(int i){
      switch (i){
           case 1:
                aP = MediaPlayer.create(this, R.raw.audio1);
                aP.start();
                break;
           case 2:
                aP = MediaPlayer.create(this, R.raw.audio2);
                aP.start();
                break;
           case 3:
                aP = MediaPlayer.create(this, R.raw.audio3);
                aP.start();
                break;
       }
       return aP;
 }

这很有效,但它很丑陋,特别是当我为了某些目的播放15个文件时。有没有更好的方法来完成我上面的工作?

3 个答案:

答案 0 :(得分:2)

之前我没有使用音频文件,但这是我最好的镜头

这是一个很好的开始。这只允许您将文件添加到一个接一个播放的缓冲区中。调用addInitFile()来启动音频文件,然后调用addFile()以添加更多文件以在第一个文件之后继续播放。它只是一个开始和代码,没有测试

被抛在一起

它可能是更好的代码,但它只是一个开始。至少比案例开关更好

我会将此作为可访问性目的的内部类

public class CustomMediaBuffer{
    public static ArrayList<Integer> buffer = new ArrayList<Integer>();

    public static void addInitFile(final int res){
        buffer.add(res);
        ap = MediaPlayer.create(this, res);
        ap.start();
        ap.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
            public void onCompletion(MediaPlayer mp){
                int indx = buffer.indexOf(res);
                if(buffer.size()-1>index){
                    ap = MediaPlayer.create(this, buffer.get(indx+1));
                    ap.start();
                }
            }
        });
    }

    public static void addFile(int res){
        buffer.add(res);
    }



}

以下是更好,更新的代码:

public class CustomMediaBuffer{
    public static ArrayList<MediaPlayer> buffer = new ArrayList<MediaPlayer>();

    public static void addInitFile(final int res){
         buffer.add( MediaPlayer.create(this, res);
        ap = buffer.get(0);
        ap.start();
        ap.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
            public void onCompletion(MediaPlayer media){
                int indx = buffer.indexOf(res);
                if(buffer.size()-1>index){
                    ap = buffer.get(indx+1));
                    ap.start();
                }
            }
        });
    }

    public static void addFile(final int res){
        final MediaPlayer mp= MediaPlayer.create(this, res );
        mp.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
            public void onCompletion(MediaPlayer media){
                int indx = buffer.indexOf(mp);
                if(buffer.size()-1>index){
                    ap = buffer.get(indx+1));
                    ap.start();
                }
            }
        });
        buffer.add(mp);

    }

}

答案 1 :(得分:1)

您可以尝试这种递归方法

MediaPlayer aP;
int  i;
R[] rid = {R.raw.audio0,R.raw.audio1,R.raw.audio2,R.raw.audio3,R.raw.audio4};


private void clipSetup(final int end) {

    aP = MediaPlayer.create(this, rid[i]);
    aP.start();
    if(i<end){
        aP.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
            @Override
            public void onCompletion(MediaPlayer mp){
                clipSetup(end);
            }
       });

    }
    i++;
}

只需在要调用它的地方调用clipSetup(5)即可。其中5是序列中的最后一个数字

答案 2 :(得分:1)

尝试使用setDetaSource()。它看起来像这样:

@Override
    public void onCompletion(MediaPlayer mp) {
        if (currentPosition < sourceArray.size()) {
            mediaPlayer.reset();
            currentResId=currentResId==RESIDS.length-1?0:currentResId+1;
            AssetFileDescriptor afd = context.getResources().openRawResourceFd(RESIDS[currentResId]);
            if (afd == null) {
                return;
            }
            mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            afd.close();
            mediaPlayer.start();
        } else {
            mediaPlayer.release();
        }
    }

但是你应该先创建RESIDS数组。 您可以从原始资源创建它:

int[] RESIDS = {R.raw.audio1,R.raw.audio2,R.raw.audio3}
int currentResId=0;

您可能需要添加try-catch。 希望这会有所帮助。