1 回答

TA贡献1777条经验 获得超10个赞
我认为你应该检查你的进口。AFAIK,声音库都在 javax.sound.sampled 中。PortMixer 位于 com.sun.media.sound 中。
本教程的作者会遇到不必要的麻烦。您可以让系统选择默认值,而不是硬编码特定的混音器。这可能是最好的策略,因为世界各地的 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”的子目录中。它还有一个睡眠命令,可以在播放剪辑时保持程序运行。Clips 在它们自己的线程下运行,但该线程是“守护进程”类型,不会阻止 Java 程序关闭。我的 a3.wav 是一个持续约 5 秒的铃声的录音。
最后一件事,上面的代码没有以理想的方式使用 Clip。Clip 的概念是用于重复使用。每次播放之前重新加载剪辑变量是低效的。剪辑变量应该只加载一次,然后按需播放。如果您将 clip.open() 和 clip.start() 作为连续的代码行,您可能应该使用 SourceDataLine 而不是 Clip,或者您应该重新编码并将这两个命令放入单独的方法中。
添加回答
举报