我在互联网上发现了这个代码,用于播放 .wav 文件
public static synchronized void playSound(final String url) {
new Thread(new Runnable() {
public void run() {
try {
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(
ClientMain.class.getResourceAsStream("sounds/" + url));
clip.open(inputStream);
clip.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
当我致电getAudioInputStream()
时,它会给我一个NullPointerException
。
这是错误:
java.lang.NullPointerException
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:130)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1111)
at it.whispers.rain.ClientMain$10.run(ClientMain.java:415)
at java.lang.Thread.run(Thread.java:744)
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:916)
at it.whispers.rain.ClientMain.send(ClientMain.java:400)
at it.whispers.rain.ClientMain.Disconnect(ClientMain.java:373)
at it.whispers.rain.ClientMain.run(ClientMain.java:319)
at java.lang.Thread.run(Thread.java:744)
编辑: 这是我在加载.wav文件时给出的内容:
java.lang.IllegalArgumentException: Invalid format
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
at it.whispers.rain.ClientMain$10.run(ClientMain.java:418)
at java.lang.Thread.run(Thread.java:744)
答案 0 :(得分:1)
生成.jar时,可以嵌入资源文件(可以由java运行时环境读取的文件)。
此行读出嵌入在.jar中的文件:
ClientMain.class.getResourceAsStream("sounds/" + url));
由于您可能尚未在.jar文件的.wav
目录中添加sounds
文件。该方法无法获取该文件并返回null
。该文件(在大多数情况下)从类文件中加载相对(因此ClientMain.class
)。
您只需通过从文件系统打开文件或嵌入波形文件来修改该行。
有关详细信息,请参阅this。
编辑:第二个错误是格式错误。也许你可以通过获取格式来解决这个问题:
AudioFormat format = inputStream.getFormat();
然后:
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);//you should postpone the creation of the clip
所以完整的代码(在Thread
中):
AudioInputStream inputStream = AudioSystem.getAudioInputStream(ClientMain.class.getResourceAsStream("sounds/" + url));
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
clip.open(inputStream);
clip.start();
可能您创建了一个Clip
,其编码/比特率/ ...与实际的.wav
文件不对应。