在今天早些时候阅读javasound标记时,我尝试实现了我们可以看到的简单代码(进行了一些小修改,例如使用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}上给出标记本身。
通过阅读javasound,我承认在IllegalArgumentException
时会抛出[...] the stream's audio format is not fully specified or invalid
。但是,它似乎确实是一种有效的格式。
我们的第一个例子在这里有什么问题? documentation from clip确实接受File
作为参数,并且从第二个示例可见,它看起来确实具有有效的音频文件数据,因为它可以工作。我错过了一些明显的东西吗如果是这样,不应该在AudioSystem.getAudioInputStream()标签上指出?
答案 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会检查以下内容:
这意味着如果您收到IllegalArgumentException,则不会在任何调音台中安装剪辑。
使用
DataLine.Info info = new DataLine.Info(Clip.class, format);
你正在定义一个新的Clip。这意味着您对getLine()方法的下一次调用将返回此对象,而不是给您一个错误。