Java中的声音:在几个剪辑中使用相同的音频输入流可以吗?
下面是我写的一个小程序:Java中的声音:在几个剪辑中使用相同的音频输入流可以吗?,java,audio,javasound,clip,Java,Audio,Javasound,Clip,下面是我写的一个小程序: 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(){
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
是否有问题。这是个问题吗?这是正确的管理方式吗
还有一个完全不同但很小的问题:如果我有一个按钮,当我点击时,它会播放一个
剪辑。剪辑播放的时间是否100%准确?(这是用于音乐制作的)。当您调用静态方法AudioSystem.getAudioInputStream()
时,您将从给定的URI获取音频输入流,只要该URI指向音频。这意味着您在代码中所做的实际上并不是使用相同的流。换句话说,你所做的是正确的
至于问题的“第二部分”,我不知道你所说的剪辑时间是什么意思?您能对此进行一点扩展吗?基于Java声音的系统会预加载数据,所以应该可以。来自Java文档
Clip
接口代表一种特殊类型的数据线,其音频数据可以在播放前加载,而不是实时流式传输
因为数据是预加载的,并且具有已知的长度,所以您可以设置剪辑以在其音频数据中的任何位置开始播放
我的意思是,我需要的程序能够播放音频文件没有任何延迟。在我调用clip.start()的那一刻,我希望剪辑能够播放。任何超过几毫秒的延迟都将是一个问题。解决这个问题的最好方法是实现它,并发现会有延迟,这是由多种原因引起的。你可以做很多事情来减少它。关于各种问题的好文章:“Java中的实时、低延迟音频处理”。