gpt4 book ai didi

java - 为什么尝试获取 Clip 会抛出异常?

转载 作者:行者123 更新时间:2023-11-30 05:40:58 25 4
gpt4 key购买 nike

我一直在关注this tutorial for Java 1.7我确信我的代码是正确的。但是,Java 在运行时会抛出 IllegalArgumentException

我尝试使用 Java 的稍新的 multi-catch 在现有的 catch block 中捕获它。然而,它只是抛出异常。

这是我的代码的开头。

        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)

注意:如果这不向前兼容,请解释。

最佳答案

我认为你应该检查你的进口。 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.open()和clip.start()作为连续的代码行,你可能应该使用SourceDataLine而不是Clip,或者你应该重新编码并将这两个命令放入单独的方法中。

关于java - 为什么尝试获取 Clip 会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55680752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com