用Java一个接一个地播放WAV文件

我正试图互相播放几个WAV文件。 我试过这个方法:

for (String file : audioFiles) { new AePlayWave(file).start(); } 

但是,它同时起到了所有作用。 所以我需要一个看起来像这样的函数:

 public void play(Vector audioFiles); 

向量包含文件,例如: "test1.wav""test2.wav"

我一直在寻找超过四个小时,但我似乎无法找到一个有效的解决方案:(

我还尝试将WAV文件连接到一个AudioInputStream。 它没有给出任何编译器错误,但声音完全搞砸了。 码:

 public static AudioInputStream concat(Vector files) throws UnsupportedAudioFileException, IOException { AudioInputStream total = AudioSystem.getAudioInputStream(new File(files.get(0))); for (int i = 1; i < files.size(); i++) { AudioInputStream clip = AudioSystem.getAudioInputStream(new File(files.get(i))); total = new AudioInputStream(new SequenceInputStream(total, clip), total.getFormat(), total.getFrameLength() + clip.getFrameLength()); } return total; } 

编辑

即使我尝试将两个第一个文件放在一起,也会失败:

 public static AudioInputStream concat(Vector files) throws UnsupportedAudioFileException, IOException { AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(files.get(0))); AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(files.get(1))); AudioInputStream total = new AudioInputStream( new SequenceInputStream(clip1, clip2), clip1.getFormat(), clip1.getFrameLength() + clip2.getFrameLength()); return total; } 

这段代码有点低级,但它有效:

  byte[] buffer = new byte[4096]; for (File file : files) { try { AudioInputStream is = AudioSystem.getAudioInputStream(file); AudioFormat format = is.getFormat(); SourceDataLine line = AudioSystem.getSourceDataLine(format); line.open(format); line.start(); while (is.available() > 0) { int len = is.read(buffer); line.write(buffer, 0, len); } line.drain(); //**[DEIT]** wait for the buffer to empty before closing the line line.close(); } catch (Exception e) { e.printStackTrace(); } } 

基本上你打开一个AudioInputStream,读取数据并将其写入SourceDataLine。 write方法是阻塞的,因此它会播放文件。

您可以尝试将Clip用于相同目的。

最后的答案(排水):

 public static void play(ArrayList files){ byte[] buffer = new byte[4096]; for (String filePath : files) { File file = new File(filePath); try { AudioInputStream is = AudioSystem.getAudioInputStream(file); AudioFormat format = is.getFormat(); SourceDataLine line = AudioSystem.getSourceDataLine(format); line.open(format); line.start(); while (is.available() > 0) { int len = is.read(buffer); line.write(buffer, 0, len); } line.drain(); line.close(); } catch (Exception ex) { ex.printStackTrace(); } } }