我一直在关注this tutorial for Java 1.7,并且我确定我的代码正确。但是,Java在运行时会抛出IllegalArgumentException
。
我尝试使用Java的较新的多捕获功能将其捕获到现有的捕获块中。但是,它只是引发异常。
这是我代码的开头。
Mixer.Info[] mixInfos = AudioSystem.getMixerInfo();
/*
for (Mixer.Info info : mixInfos)
{
System.out.println(info.getName() + " - " + info.getDescription());
}
*/
mixer = AudioSystem.getMixer(mixInfos[0]);
DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
try
{
clip = (Clip) mixer.getLine(dataInfo);
}
我希望代码将继续运行并播放Clip
,但出现此异常:
Exception in thread "main" java.lang.IllegalArgumentException: Line unsupported: interface Clip
at java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:131)
at main.Driver.main(Driver.java:35)
注意:如果这不兼容,请解释。
答案 0 :(得分:0)
我认为您应该检查您的进口。 AFAIK,声音库全部在javax.sound.sampled中。 PortMixer位于com.sun.media.sound中。
本教程的作者将遇到不必要的麻烦。您可以让系统选择默认值,而不是对特定的Mixer进行硬编码。这可能是最好的策略,因为世界各地的PC都将具有多种硬件配置。
以下是一个可能有用的示例。请注意,我们甚至都不必声明一个Mixer。
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class BasicClipExample {
public static void main(String[] args) {
BasicClipExample bc = new BasicClipExample();
try {
bc.run();
} catch (UnsupportedAudioFileException | IOException
| LineUnavailableException | InterruptedException e) {
e.printStackTrace();
}
}
private void run() throws UnsupportedAudioFileException,
IOException, LineUnavailableException, InterruptedException
{
String filename = "a3.wav";
URL url = this.getClass().getResource("audio/" + filename);
System.out.println(url);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
Thread.sleep(6000);
clip.close();
}
}
此示例假定您的音频文件位于名为“ / audio”的子目录中。 它还具有sleep命令,以在播放Clip时保持程序运行。剪辑在其自己的线程下运行,但是该线程是“守护程序”类型,不会阻止Java程序关闭。我的a3.wav是铃响的录音,碰巧持续了大约5秒钟。
最后,上面的代码没有以理想的方式使用Clip。剪辑的概念是供重复使用。每次播放时在剪辑之前重新加载clip变量效率很低。 clip变量应该只加载一次,然后按需播放。如果您具有clip.open()和clip.start()作为连续的代码行,则可能应该使用SourceDataLine而不是Clip,或者应该重新编码并将这两个命令放入单独的方法中。