这是我写的一个小程序:
package learningSound;
import java.io.*;
import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;
public class Main extends JFrame {
Clip clip1,clip2,clip3;
AudioInputStream audioIn;
public Main(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Test Sound Clip");
this.setSize(300, 200);
this.setVisible(true);
try{
URL url1 = this.getClass().getResource("ah.wav");
audioIn = AudioSystem.getAudioInputStream(url1);
clip1 = AudioSystem.getClip();
clip1.open(audioIn);
URL url2 = this.getClass().getResource("eh.wav");
audioIn = AudioSystem.getAudioInputStream(url2);
clip2 = AudioSystem.getClip();
clip2.open(audioIn);
URL url3 = this.getClass().getResource("ih.wav");
audioIn = AudioSystem.getAudioInputStream(url3);
clip3 = AudioSystem.getClip();
clip3.open(audioIn);
clip1.start();
clip2.start();
clip3.start();
}catch(Exception e){e.printStackTrace();}
}
public static void main(String[] args) {
new Main();
}
}
它有效,但我想知道对于几个剪辑使用相同的AudioInputStream
是否存在问题。这是出于某种原因的问题吗?这是管理事物的正确方法吗?
另外,一个完全不同的问题,但一个小问题:如果我有一个点击按钮,播放Clip
。播放剪辑的时间是否100%准确? (这是为了制作音乐)。
答案 0 :(得分:1)
当您调用静态方法AudioSystem.getAudioInputStream()
时,您将从给定的URI获取音频输入流,只要该URI指向音频即可。这意味着您在代码中执行的操作实际上并未使用相同的流。换句话说,你所做的是正确的。
关于问题的“第2部分”,我不确定剪辑的时间是什么意思?你可以稍微扩展一下吗?
答案 1 :(得分:1)
基于Java Sound Clip
预加载数据,所以应该没问题。来自Java Docs。
Clip
界面代表一种特殊类型的数据线,其音频数据可以在播放前加载,而不是实时流式传输。由于数据是预先加载的且具有已知长度,您可以设置剪辑以开始播放其音频数据中的任何位置。 ..