无法播放剪辑声音

Could not play a clip sound

提问人:Alex Vathana 提问时间:11/7/2022 更新时间:11/7/2022 访问量:93

问:

我是编程新手,我不知道如何播放声音剪辑。代码运行流畅,但 intellij 没有发出声音。

这是我的代码

package ProjectWumpus;
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
public class testClass {

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
        File file = new File("C:\\Users\\Correct_Answer_Sound_Effect.wav");
        AudioInputStream audiostream = AudioSystem.getAudioInputStream(file);
        Clip clip = AudioSystem.getClip();
        clip.open(audiostream);
        clip.start();

我的电脑上的音频工作正常。

java 性能 音频 javasound playsound

评论

1赞 greg-449 11/7/2022
这只是开始声音,你在做什么来等待它真正播放?
0赞 camickr 11/7/2022
该类在声音开始播放之前完成执行。查看:stackoverflow.com/a/64509714/131872 以获得更好的测试课程。

答:

0赞 Phil Freihofner 11/7/2022 #1

在评论中,两位受访者都指出,该程序在有机会播放之前就关闭了。 立即将控制权交还给主线程。执行播放的代码位于线程上。 线程不会打开准备关闭的程序。ClipClipsdaemonDaemon

FWIW,这也许是一种更好的测试方法。在下面的代码中,一个简单的 GUI:一个播放声音的按钮。这是剪辑使用方式的更典型。

public class TestClip {
        
    public static void main(String[] args) {
 
        EventQueue.invokeLater(new Runnable(){
        
            public void run()
            {   
                DemoFrame frame = new DemoFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }   
}
    
class DemoFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private Clip clip;
    
    public DemoFrame() {
        
        setSize(300, 100);          
        JPanel panel = new JPanel();
        JButton button = new JButton("Play clip");
        button.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                clip.setFramePosition(0);
                clip.start();
            }
        });
        
        panel.add(button);
        add(panel);

        // Set up the Clip
        URL url = this.getClass().getResource("mySound.wav");
        try {
            AudioInputStream ais = AudioSystem.getAudioInputStream(url);
            clip = AudioSystem.getClip();
            clip.open(ais);
            
        } catch ( LineUnavailableException e) {
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

我建议使用over作为该方法。在本例中,假定音频资源与调用它的类位于同一目录中。A 的好处是,当类被打包在 jar 中时,它可以工作(与 不同)。URLFilegetAudioInputStreamURLFile