gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:15:00 32 4
gpt4 key购买 nike

我一直在尝试使用 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/

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