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

No method named getClip was found in type "javax.sound.sampled.AudioSystem"

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

我从来没有用过它,但看起来你必须这样做:

Clip clip = new Clip(); // Think that you can pass the stream as parameter for the builder
clip.open(audioInputStream);

参考此处:https://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/Clip.html#open(javax.sound.sampled.AudioInputStream)

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

在Java1.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();
    }
}