簡體   English   中英

你如何在Java中順序播放音頻文件?

[英]How do you play audio file sequentially in Java?

因此,對於我正在開發的應用程序,我有一堆音頻文件,根據某些變量的狀態,這些文件可能會或可能不會播放(並且它們的播放順序也可能會改變)。

我了解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 個以上的文件時。 有沒有更好的方法來完成我上面的內容?

我以前沒有處理過音頻文件,但這是我最好的鏡頭

這是一個很好的開始想法。 這僅允許您將文件添加到將一個接一個播放的緩沖區中。 調用 addInitFile() 開始一個音頻文件,然后調用 addFile() 添加更多文件以在第一個文件之后繼續播放。 這只是一個開始和未經測試就扔在一起的代碼

它可能是更好的代碼,但這只是一個開始。 至少比 case switch 好

出於可訪問性目的,我會將其設為內部類

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){
        final MediaPlayer mp= MediaPlayer.create(this, res );
        buffer.add(mp);
        ap = buffer.get(0);
        ap.start();
        ap.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();
                }
            }
        });
    }

    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);

    }

}

您可以嘗試這種遞歸方法

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 是序列中的最后一個數字

嘗試使用 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。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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