在Java中播放声音一段时间后停止工作
我已经实现了一个简单的Java声音播放器(.wav),它工作得很好,只是在播放了50-60种声音之后,它就停止工作了 代码类似于,但我将在此处发布我的代码:在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
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();
}
});