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

标签 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 个文件时。有没有更好的方法来完成我上面的内容?

最佳答案

我以前没有处理过音频文件,但这是我最好的一张照片

这是一个很好的开始。这只允许您将文件添加到将一个接一个播放的缓冲区。调用 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);

    }

}

关于java - 你如何在Java中顺序播放音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881684/

相关文章:

android - 使用 MediaDrm 在 Android 中解密受 Widevine DRM 保护的视频

java - 使用 Android Nearby API 检测 Beacon (Eddystone)

ios - 更新应用程序后 UILocalNotification 自定义声音无法正常工作

java - 使用 Project Reactor 递归 react 流

java - Spring REST巨大的响应导致响应编写器被多次调用

java - 将通用变量作为 long 分配给 CountDownTimer

java - 设置项目点击监听器时Android空指针异常

java - 有没有办法从 JFrame 返回特定元素?

javascript - 为什么我在ipad air中收到的播放按钮形状不同于在台式机中?

javascript - 在 div 中播放音频