Java 为什么尝试获取剪辑会引发异常?
我一直在跟踪,我确信我的代码是正确的。但是,Java在运行时抛出一个Java 为什么尝试获取剪辑会引发异常?,java,javasound,Java,Javasound,我一直在跟踪,我确信我的代码是正确的。但是,Java在运行时抛出一个IllegalArgumentException 我尝试在现有的catch块中捕获它,使用Java稍新的multi-catch。然而,它只是抛出异常 这是我的代码的开头 Mixer.Info[]mixInfos=AudioSystem.getMixerInfo(); /* 用于(Mixer.Info:mixenfos) { System.out.println(info.getName()+“-”+info.getDescrip
IllegalArgumentException
我尝试在现有的catch块中捕获它,使用Java稍新的multi-catch。然而,它只是抛出异常
这是我的代码的开头
Mixer.Info[]mixInfos=AudioSystem.getMixerInfo();
/*
用于(Mixer.Info:mixenfos)
{
System.out.println(info.getName()+“-”+info.getDescription());
}
*/
mixer=AudioSystem.getMixer(mixInfos[0]);
DataLine.Info dataInfo=新的DataLine.Info(Clip.class,null);
尝试
{
clip=(clip)mixer.getLine(dataInfo);
}
我希望代码将继续运行并播放剪辑
,但我得到了以下例外:
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)
注意:如果这是不向前兼容的,请解释。我认为您应该检查您的导入。另外,声音库都在javax.sound.sampled中。PortMixer位于com.sun.media.sound中 本教程的作者将遇到比必要时多得多的麻烦。您可以让系统选择默认值,而不是硬编码特定的混音器。这可能是最好的策略,因为世界上的个人电脑将有不同的硬件配置 下面是一个可能有用的示例。请注意,我们甚至不需要声明混音器
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命令,在播放剪辑时保持程序运行。剪辑在自己的线程下运行,但线程是“守护程序”类型,不会阻止Java程序关闭。我的a3.wav是一个钟的录音,刚好持续5秒左右
最后,上面的代码没有以理想的方式使用剪辑。剪辑的概念是为了重复使用。在每次播放之前重新加载clip变量是低效的。clip变量只应加载一次,然后按需播放。如果将clip.open()和clip.start()作为连续的代码行,则可能应该使用SourceDataLine而不是clip,或者应该重新编码并将这两个命令放入单独的方法中。另外,我使用的是JDK 11.0.2 try块中的哪一行是第35行
clip=(clip)mixer.getLine(dataInfo)
您可能会更幸运地删除mixer.Info和DataLine.Info代码,然后改用。发生了这样的情况:线程“main”java.lang.IllegalArgumentException中的异常:不支持行:接口剪辑支持格式PCM\u签名未知采样率,16位,立体声,4字节/帧,big-endian位于java.desktop/com.sun.media.sound.PortMixer.getLine(PortMixer.java:131)的java.desktop/javax.sound.sampled.AudioSystem.getClip(AudioSystem.java:493)的main.Driver.main(Driver.java:26)