我目前正在编写一个小游戏,并试图实现背景音乐。我对Java中的视觉/音频相当陌生,在网上做了一些研究后,我发现Clip将是一个与我如何处理图形兼容的选项。所以,我遵循了一个教程,介绍了如何设置/使用它,导致了这个'Sound'类:
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.*;
public class Sound implements LineListener {
boolean isPlaybackCompleted;
int playMode;
public Sound(int mode) {
playMode = mode; // 0 = background music
}
@Override
public void update(LineEvent event) {
if (LineEvent.Type.START == event.getType()) {
isPlaybackCompleted = false;
System.out.println("Playback started.");
} else if (LineEvent.Type.STOP == event.getType()) {
isPlaybackCompleted = true;
System.out.println("Playback completed.");
}
}
public void playSound(String soundName) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("./Sounds/facilityIndoors.wav");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);
AudioFormat audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
Clip audioClip = (Clip) AudioSystem.getLine(info);
audioClip.addLineListener(this);
audioClip.open(audioStream);
audioClip.start();
switch(playMode){
case 0:
if(isPlaybackCompleted == true) {
}
}
audioClip.close();
audioStream.close();
}
}
字符串
(Note playSound的'soundName'参数是我希望以后实现的东西,这样我就可以基于与当前Map名称共享的变量在轨道之间切换,并且当前未使用,我刚刚硬编码了一个文件的路径,该文件现在已经存在用于测试)
在我的main中有示例化和函数调用
Sound music = new Sound(0);
music.playSound(map.currentMap);
型
当我尝试调用playSound函数时,会抛出这个错误:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:209)
at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1006)
at Sound.playSound(Sound.java:37)
at Program.main(Program.java:22)
型
一开始我以为我把文件路径拼写错了,但经过仔细检查,我的拼写似乎是正确的,如下所示:Image of file path and file name 'Global Research FacilityJava 8'是我的项目文件夹,我的图像引用似乎是从那个级别开始的,所以也许Clip不从项目文件夹开始,这可能是问题所在,但如果是,我不知道如何解决这个问题。
我试着检查文件路径中的拼写错误,并试着从一开始就省略了一些符号(例如“Sounds/facilityIndoors.wav”或“/Sounds/facilityIndoors.wav”),但错误仍然存在。在发布此之前检查可能重复的列表时,我还发现了一篇文章,谈论将我所有的资源文件夹放到一个“资源”文件夹中,并将其添加到构建路径中,我现在已经尝试过了,但无济于事,仍然抛出相同的错误。(文件路径现在为“resources/Sounds/facilityIndoors.wav”)
1条答案
按热度按时间eulz3vhy1#
我也遇到过同样的问题,但我没有找到解决它的方法,而是决定通过将音频文件复制到PC上的某个位置来解决它。
尝试此代码复制文件
字符串
现在只需要像这样使用
audio
文件型