在Java中播放声音一段时间后停止工作

在Java中播放声音一段时间后停止工作,java,audio,Java,Audio,我已经实现了一个简单的Java声音播放器(.wav),它工作得很好,只是在播放了50-60种声音之后,它就停止工作了 代码类似于,但我将在此处发布我的代码: import java.io.BufferedInputStream; import java.io.InputStream; import java.net.URL; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; i

我已经实现了一个简单的Java声音播放器(.wav),它工作得很好,只是在播放了50-60种声音之后,它就停止工作了

代码类似于,但我将在此处发布我的代码:

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class NewWavPlayer {
    private URL url;
    private AudioInputStream audio;

    public NewWavPlayer(URL url) {
        this.url = url;
    }

    public void play() {
          try
          {
            InputStream audioSrc = url.openStream();
            InputStream bufferedIn = new BufferedInputStream(audioSrc);
            audio = AudioSystem.getAudioInputStream(bufferedIn);            
            Clip clip = AudioSystem.getClip();
            clip.open(audio);
            clip.start();
          } catch(Exception e) { 
              System.err.println(e);
          }
    }
}
一段时间后,我得到的错误是:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian not supported.

但这没有意义,因为以前播放过相同的声音(或其他已经正确播放的声音)。我在Linux Ubuntu15.04上运行它,其他用户在其他SOs上也有同样的体验


我尝试用线程重新实现它,但我得到了同样的错误。我想知道下一步应该采取哪些步骤。

我看到的一件事是您没有关闭InputStreams。您可能已经用完了手柄。关闭finally子句中的输入流,即

public void play() {
        InputStream audioSrc = null;
        InputStream bufferedIn = null;
      try {
        audioSrc = url.openStream();
        bufferedIn = new BufferedInputStream(audioSrc);
        audio = AudioSystem.getAudioInputStream(bufferedIn);            
        Clip clip = AudioSystem.getClip();
        clip.open(audio);
        clip.start();
      } catch(Exception e) { 
          System.err.println(e);
      } finally {
          if (bufferedIn != null) {
              bufferedIn.close();
          }
          if (audioSrc != null) {
              audioSrc.close();
          }
}
如果操作系统的句柄不足,您可能必须重新启动系统。以上将确保这种情况不会再次发生


希望这有帮助

我看到的一件事是,您没有关闭输入流。您可能已经用完了手柄。关闭finally子句中的输入流,即

public void play() {
        InputStream audioSrc = null;
        InputStream bufferedIn = null;
      try {
        audioSrc = url.openStream();
        bufferedIn = new BufferedInputStream(audioSrc);
        audio = AudioSystem.getAudioInputStream(bufferedIn);            
        Clip clip = AudioSystem.getClip();
        clip.open(audio);
        clip.start();
      } catch(Exception e) { 
          System.err.println(e);
      } finally {
          if (bufferedIn != null) {
              bufferedIn.close();
          }
          if (audioSrc != null) {
              audioSrc.close();
          }
}
如果操作系统的句柄不足,您可能必须重新启动系统。以上将确保这种情况不会再次发生


希望这有帮助

我发现代码有问题。经过一些研究,我发现在一个听众中关闭剪辑是一种方法。我从这里得到了密码:


我发现代码有问题。经过一些研究,我发现在一个听众中关闭剪辑是一种方法。我从这里得到了密码:


或者你可以让你的生活更简单,并使用这是一个很好的提示,但不幸的是,它不适合我。错误仍然存在。当我再次运行这个应用程序时(通过Eclipse或外部的.jar),它会再次工作,直到它在复制了大约50-60次声音后突然停止(我计算过)。这听起来确实像是你的操作系统已经没有手柄了。我建议添加finally子句,重新启动,看看问题是否存在。最坏的情况是,这将消除这一理论。只是一个建议:)或者你可以让你的生活更简单,并使用这是一个很好的提示,但不幸的是,它不适合我。错误仍然存在。当我再次运行这个应用程序时(通过Eclipse或外部的.jar),它会再次工作,直到它在复制了大约50-60次声音后突然停止(我计算过)。这听起来确实像是你的操作系统已经没有手柄了。我建议添加finally子句,重新启动,看看问题是否存在。最坏的情况是,这将消除这一理论。只是一个建议:)
final Clip clip = AudioSystem.getClip();
clip.addLineListener(new LineListener() {
    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP)
            clip.close();
    }
});