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 吗?的主要内容,如果未能解决你的问题,请参考以下文章