Java wav听起来像NullPointer

时间:2014-06-25 19:21:05

标签: java audio

我在互联网上发现了这个代码,用于播放 .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)

1 个答案:

答案 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文件不对应。