gpt4 book ai didi

java - 在类型 "javax.sound.sampled.AudioSystem"中找不到名为 getClip 的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:28 24 4
gpt4 key购买 nike

尝试在 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)

最佳答案

OP 和无法找到方法的问题与显然运行 Java 1.4 的 Ready to Program IDE 有关。根据 JavaDocs for AudioSystem,Java 1.5 中添加了问题中的 .getClip() 方法。

但是,过去我遇到过系统找不到我的特定发言人的问题,因此以下方法对我有用。请注意,我使用了 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();
}
}

关于java - 在类型 "javax.sound.sampled.AudioSystem"中找不到名为 getClip 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296395/

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