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