Java中的声音:对几个剪辑使用相同的AudioInputStream是否可以?

时间:2014-01-11 00:35:53

标签: 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(){

        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%准确? (这是为了制作音乐)。

2 个答案:

答案 0 :(得分:1)

当您调用静态方法AudioSystem.getAudioInputStream()时,您将从给定的URI获取音频输入流,只要该URI指向音频即可。这意味着您在代码中执行的操作实际上并未使用相同的流。换句话说,你所做的是正确的。

关于问题的“第2部分”,我不确定剪辑的时间是什么意思?你可以稍微扩展一下吗?

答案 1 :(得分:1)

基于Java Sound Clip预加载数据,所以应该没问题。来自Java Docs。

  

Clip界面代表一种特殊类型的数据线,其音频数据可以在播放前加载,而不是实时流式传输。

     

由于数据是预先加载的且具有已知长度,您可以设置剪辑以开始播放其音频数据中的任何位置。 ..