尝试在java中播放音频片段,但每次都会弹出此错误。我导入了我需要的所有东西,所以我不确定问题是什么。
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream (this.getClass ().getResource ("hopes_and_dreams.wav"));
Clip clip = AudioSystem.getClip ();
clip.open (audioInputStream);
clip.start ();
javax.sound.sampled.LineUnavailableException: Failed to allocate clip data: Requested buffer too large.
at com.sun.media.sound.MixerClip.implOpen(Unknown Source)
at com.sun.media.sound.MixerClip.open(Unknown Source)
at com.sun.media.sound.MixerClip.open(Unknown Source)
at CA_PeterLang.paint(CA_PeterLang.java:828)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
答案 0 :(得分:1)
我从未使用它,但似乎你必须这样做:
Clip clip = new Clip(); // Think that you can pass the stream as parameter for the builder
clip.open(audioInputStream);
答案 1 :(得分:1)
OP的问题并且无法找到该方法与显然运行Java 1.4的Ready to Program
IDE有关。根据{{3}}
.getClip()
方法已添加到Java 1.5中
但是,在过去,我遇到系统无法找到我的特定发言人的问题,因此以下方法对我有用。请注意,我使用的是URL,但它应该适用于getResource()
方法。
private Mixer.Info getSpeakers()
{
Mixer.Info speakers = null;
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
for (Mixer.Info mi : mixerInfo) {
// System.out.println(mi.getName() + "\t" +
// mi.getDescription());
if (mi.getName().startsWith("Speakers")) {
speakers = mi;
}
}
System.out.println(
(speakers != null ? speakers.getName() : "<no speakers>"));
return speakers;
}
public void playSound(String soundFile)
{
AudioInputStream ais = null;
try {
URL url = new File(soundFile).toURI().toURL();
ais = AudioSystem.getAudioInputStream(url);
Mixer mixer = AudioSystem.getMixer(getSpeakers());
DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
Clip clip = (Clip)mixer.getLine(dataInfo);
clip.open(ais);
clip.start();
do {
try {
Thread.sleep(50);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
while (clip.isActive());
}
catch (UnsupportedAudioFileException | IOException |
LineUnavailableException e)
{
e.printStackTrace();
}
}
使用playSound("Alarm01.wav")
调用时,它会正确执行。我认为这种方法使用稍微旧的方法。
编辑:请不要在这里跟随我的名字 - 他们被黑客攻击进行测试。
编辑2:foreach
循环可以更改为:
for (int i = 0; i < mixerInfo.length; ++i) {
Mixer.Info mi = mixerInfo[i];
...
编辑3:要用作InputStream
而不是URL
,请使用
InputStream is = this.getClass().getClassLoader().getResourceAsStream(soundName);
// add a check for null
ais = AudioSystem.getAudioInputStream(is);
编辑4:此方法适用于Java 1.4(据我所知)。我不得不在我的本地机器设置上乱七八糟地获取声音,但这是一个不同的问题。
public void playSoundOldJava(String soundFile)
{
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(soundFile);
// TODO: add check for null inputsteam
if (is == null) {
throw new IOException("did not find " + soundFile);
}
AudioInputStream ais = AudioSystem.getAudioInputStream(is);
DataLine.Info dataInfo = new DataLine.Info(Clip.class, ais.getFormat());
if (AudioSystem.isLineSupported(dataInfo)) {
Clip clip = (Clip)AudioSystem.getLine(dataInfo);
System.out.println("open");
clip.open(ais);
clip.start();
do {
try {
Thread.sleep(50);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
while (clip.isActive());
}
}
catch (Exception e) {
e.printStackTrace();
}
}