java - 尝试在 JFrame 上播放声音时出现 AudioClip 问题

标签 java audio clip

我一直在尝试使用 AudioClips 播放 sound1 和 sound2。这是我的代码:

import javax.sound.sampled.*;

public class Sound {

private Clip clip;

public static final Sound sound1 = new Sound("src/Sounds/Classic_Horror_2.wav");
public static final Sound sound2 = new Sound("src/Sounds/Classic Horror 3.mp3");

public Sound (String fileName) {
    try {
        AudioInputStream ais = AudioSystem.getAudioInputStream(Sound.class.getResource(fileName));
        clip = AudioSystem.getClip();
        clip.open(ais);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void play() {
    try {
        if (clip != null) {
            new Thread() {
                public void run() {
                    synchronized (clip) {
                        clip.stop();
                        clip.setFramePosition(0);
                        clip.start();
                    }
                }
            }.start();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void stop(){
    if(clip == null) return;
    clip.stop();
}

public void loop() {
    try {
        if (clip != null) {
            new Thread() {
                public void run() {
                    synchronized (clip) {
                        clip.stop();
                        clip.setFramePosition(0);
                        clip.loop(Clip.LOOP_CONTINUOUSLY);
                    }
                }
            }.start();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public boolean isActive(){
    return clip.isActive();
}
}

当我尝试执行 Sound.sound1.loop(); 时或 Sound.sound1.play();我得到一个空指针异常。 sound2 也是如此。以下是确切的错误消息:

java.lang.NullPointerException
at com.sun.media.sound.StandardMidiFileReader.getSequence(StandardMidiFileReader.java:207)
at javax.sound.midi.MidiSystem.getSequence(MidiSystem.java:841)
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:178)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1147)
at Sound.<init>(Sound.java:12)
at Sound.<clinit>(Sound.java:7)
at IntroductionComponent.<init>(IntroductionComponent.java:54)
at IntroductionGUI.main(IntroductionGUI.java:9)


java.lang.NullPointerException
at com.sun.media.sound.StandardMidiFileReader.getSequence(StandardMidiFileReader.java:207)
at javax.sound.midi.MidiSystem.getSequence(MidiSystem.java:841)
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:178)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1147)
at Sound.<init>(Sound.java:12)
at Sound.<clinit>(Sound.java:8)
at IntroductionComponent.<init>(IntroductionComponent.java:54)
at IntroductionGUI.main(IntroductionGUI.java:9)

我反复浏览 stackoverflow 来寻找可能的修复方法,但可能是 fileName 不断返回 null,或者我的 URL 不正确。也就是说,据我所知,它可能是任何东西。关于如何解决这个问题有什么建议吗?

最佳答案

在您的路径中包含 src...

public static final Sound sound1 = new Sound("src/Sounds/Classic_Horror_2.wav");
public static final Sound sound2 = new Sound("src/Sounds/Classic Horror 3.mp3");

是你的关键问题,一旦应用程序构建和打包,src将不存在,你永远不应该引用src

您可能应该使用更像...的东西

public static final Sound sound1 = new Sound("/Sounds/Classic_Horror_2.wav");
public static final Sound sound2 = new Sound("/Sounds/Classic Horror 3.mp3");

public Sound (String fileName) {
    try {
        AudioInputStream ais = AudioSystem.getAudioInputStream(getClass().getResource(fileName));
        clip = AudioSystem.getClip();
        clip.open(ais);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

就我个人而言,我会让 Sound 需要 URL...

public Sound (URL url) {
    try {
        AudioInputStream ais = AudioSystem.getAudioInputStream(url);
        clip = AudioSystem.getClip();
        clip.open(ais);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这样就不会混淆 String 的含义,并且您可以传递来自嵌入式资源、文件引用甚至网络的引用

同样从内存中,clip.start() 创建了自己的线程,因此无需创建自己的线程

关于java - 尝试在 JFrame 上播放声音时出现 AudioClip 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951496/

相关文章:

Java比较两个相同的对象给出错误

java - 弹跳形状嵌套在另一个形状中(这段代码有什么问题)

python - 从音频文件生成波形图像

java - 特定 wav 文件无法加载,而其他文件加载没有错误

java - JTable 行排序而不更改 "Sl No"列

java - 查找列表,其中值 == x

java - 无法在我的网站中播放 .m4a 或 .3gpp 音频文件

javascript - HTML5 音频对象不能在 Safari 中播放

image - svg 剪辑图像并显示描边

css - Chrome -webkit-clip-path 和大纲错误