使用Stackoverflow的javasound标签示例播放音频

时间:2014-10-18 00:51:15

标签: java audio

在今天早些时候阅读标记时,我尝试实现了我们可以看到的简单代码(进行了一些小修改,例如使用File代替URL):

File file = new File(System.getProperty("user.dir") + "/sound.wav");
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream(file);
clip.open(ais); // exception

但是当我尝试打开我们在那里看到的java.lang.IllegalArgumentException: Invalid format时,我得到AudioInputStream

然而,当我尝试使用以下来自互联网的代码时

File file = new File(System.getProperty("user.dir") + "/sound.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(file);
AudioFormat format = ais.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(ais);
clip.start();

确实工作:sound.wav正确播放 - 但是,我觉得这对于一些应该像我们的第一个例子一样简单的事情很笨拙,在{{3}上给出标记本身。

通过阅读,我承认在IllegalArgumentException时会抛出[...] the stream's audio format is not fully specified or invalid。但是,它似乎确实是一种有效的格式。

我们的第一个例子在这里有什么问题? documentation from clip确实接受File作为参数,并且从第二个示例可见,它看起来确实具有有效的音频文件数据,因为它可以工作。我错过了一些明显的东西吗如果是这样,不应该在AudioSystem.getAudioInputStream()标签上指出?

1 个答案:

答案 0 :(得分:2)

经过一番研究后,我发现它可能与系统属性有关。在这些属性中,您可以指定getLine()方法的默认值(getLine(),getClip(),getSourceDataLine()和getTargetDataLine())。如果您调用其中一种方法,Java会执行以下操作(AudioSystem description):

系统属性javax.sound.sampled.Clip设置为

javax.sound.sampled.Clip = great.Mixer#great.clip.Clap

Mixer类名为 great.Mixer ,剪辑名为 great.clip.Clap

当您请求Clip时,Java会检查以下内容:

  • 如果找到了混音器 great.Mixer 且包含Clip great.clip.Clap ,则返回此剪辑
  • 如果找到混音器 great.Mixer ,但不包含Clip great.clip.Clap ,则返回混音器中指定的第一个剪辑
  • 如果调音台 great.Mixer 不包含任何剪辑或找不到,请在任意内容中返回 great.clip.Clap 的第一个实例混合器
  • 如果没有混音器包含 great.clip.Clap ,请返回找到的第一个混音器的第一个剪辑
  • 如果在任何混音器中未指定Clip,则抛出 IllegalArgumentException

这意味着如果您收到IllegalArgumentException,则不会在任何调音台中安装剪辑。

使用

DataLine.Info info = new DataLine.Info(Clip.class, format);

你正在定义一个新的Clip。这意味着您对getLine()方法的下一次调用将返回此对象,而不是给您一个错误。