一段时间后停止工作,用Java播放声音

时间:2015-11-20 05:38:30

标签: java audio

我已经实现了一个效果很好的简单Java声音播放器(.wav),除了在播放50-60个声音后它停止工作。

代码类似于Playing .mp3 and .wav in Java?,但无论如何我都会在这里发帖:

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.

javax.sound.sampled.LineUnavailableException: line with format PCM_UNSIGNED 22050.0 Hz, 8 bit, mono, 1 bytes/frame,  not supported.

但它没有意义,因为之前播放了相同的声音(或其他已经正确播放的声音)。我在Linux Ubuntu 15.04上运行它,其他用户也经历过与其他SO相同的操作。

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

2 个答案:

答案 0 :(得分:0)

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

seq 10 | sed -e '1,4d;$d;' -e '5 i\['

如果您的操作系统已用完句柄,则可能需要重新启动系统。以上将确保它不会再次发生。

希望这有帮助!

答案 1 :(得分:0)

我发现代码存在问题。经过一些研究后,我发现在听众中关闭Clip是可行的方法。我从这里得到了代码:https://stackoverflow.com/a/17277981/3552500

final Clip clip = AudioSystem.getClip();
clip.addLineListener(new LineListener() {
    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP)
            clip.close();
    }
});