Java 中的声音:可以为多个剪辑使用相同的 AudioInputStream 吗?

Posted

技术标签:

【中文标题】Java 中的声音:可以为多个剪辑使用相同的 AudioInputStream 吗?【英文标题】:Sound in Java: Is it okay to use the same AudioInputStream for several Clips? 【发布时间】:2014-01-11 00:35:52 【问题描述】:

这是我写的一个小程序:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我的意思是我需要程序能够无延迟地播放音频文件。在我调用 clip.start() 的那一刻,我想要播放剪辑。任何超过几毫秒的延迟都是一个问题。 那么最好的办法就是实施它并找出答案 会有延迟,由多种原因引起。你可以做很多事情来尝试减轻它。关于各种问题的好文章:quod.lib.umich.edu/cgi/p/pod/…“Java 中的实时、低延迟音频处理”。【参考方案2】:

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

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

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

【讨论】:

以上是关于Java 中的声音:可以为多个剪辑使用相同的 AudioInputStream 吗?的主要内容,如果未能解决你的问题,请参考以下文章

快速连续播放剪辑时的点击声音

播放声音剪辑的 Java 问题

Audio Loop Processing.org(Java/Minim 声音库)

杀死音频剪辑线程

JQuery 不播放多个声音文件或延迟事件

如何将音频剪辑转换为数组以执行 FFT?