【发布时间】:2020-12-07 00:14:26
【问题描述】:
抱歉,如果以前有人问过这个问题,但我无法找到适合我们的答案。我也是初学者,请多多包涵。
基本上,在破坏我们的代码后,音频停止工作。
clip = AudioSystem.getClip();
File file = new File(musicLocation);
clip.open(AudioSystem.getAudioInputStream(file.getAbsoluteFile()));
clip.start();
我尝试过使用 getResourceAsStream 和 getResource,因为显然文件在 jarred 时无法正常工作,但即使在 Intellij 中它仍然无法正常工作。
我的代码位于 src 文件夹中,音乐位置被传递给代码,如下所示:
filepath = "src/Images/music/click.wav";
musicObject.playMusic(filepath);
图像在 jar 文件中正常工作。
编辑:jar 文件似乎无法获取音频文件,这些文件位于另一个正在访问的文件夹中,因为 jar 的文件大小在删除 .wav 文件后没有改变。
编辑 2:
public class Music {
Clip loop;
void loopMusic(String musicLocation) {
try {
loop = AudioSystem.getClip();
InputStream is = getClass().getResourceAsStream(musicLocation);
AudioInputStream audioS = AudioSystem.getAudioInputStream(is);
loop = AudioSystem.getClip();
loop.open(audioS);
loop.start();
loop.loop(Clip.LOOP_CONTINUOUSLY);
} catch (Exception e) {
System.out.println(e);
}
}
void stopLoop(){
if (loop != null) {
loop.stop();
loop.close();
}
loop=null;
}
}
这是我们尝试使用的 coe。 musicLocation 字符串以以下格式传递:/folder/file.wav
通过winrar手动将.wav文件放入jar后,仍然无法加载jar文件中的音乐。
编辑 3:尝试使用 URL 类,收到 NullPointerException
URL musicLocation = this.getClass().getResource("/Images/music/battle.wav");
AudioInputStream inputStream = AudioSystem.getAudioInputStream(musicLocation);
当作为位置名称前带有“src”的文件传递到 AudioInputStream 时,它不会传递空值。
编辑 4:尝试将 URL 类与 Music 类包中文件夹内的文件一起使用
URL musicLocation = this.getClass().getResource("audio/battle.wav");
AudioInputStream inputStream = AudioSystem.getAudioInputStream(musicLocation);
由于上面的音频文件夹位于类(包含所有 .java 文件)包中,这将返回 NullPointerException。在前面添加“Classes/”后,将鼠标悬停在我的 IDE 中的字符串上可以让我“看到”该文件是否被正确获取,但它仍会向 .wav 文件返回 NullPointerException。
编辑 5: 执行 Phil 的代码后收到此错误
Exception in thread "main" java.lang.ExceptionInInitializerError
at Classes.Frame.<init>(Frame.java:15)
at Classes.GraphicsRunner.main(GraphicsRunner.java:15)
Caused by: java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:222)
at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1032)
at Classes.Music.<init>(Music.java:16)
at Classes.Panel.<clinit>(Panel.java:24)
... 2 more
编辑 6:显示导致上述错误的类
package Classes;
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.*;
import java.net.URL;
public class Music {
Clip clip;
// Constructor, create looping audio resource, hold in memory.
public Music() {
URL url = this.getClass().getResource("audio/battle.wav");
AudioInputStream ais;
try {
ais = AudioSystem.getAudioInputStream(url);
//line 16 above
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
e.printStackTrace();
}
}
public void play() {
clip.setFramePosition(0);
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
}
编辑 7:Phils 使用相同的代码集将项目移至 Eclipse。我仍然不确定为什么它在 Intellij 中不起作用,但我的问题仍然解决了。感谢所有提供帮助的人!
【问题讨论】:
-
这能回答你的问题吗? Get audio to play in JAR File
-
在实现getResourceAsStream 和getAudioInputStream 后,就像下面说的,它仍然不起作用。
标签: java intellij-idea audio jar