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中的实时、低延迟音频处理”。