我已经实现了一个效果很好的简单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相同的操作。
我尝试用线程重新实现它,但我得到了同样的错误。我想知道接下来应采取哪些步骤。
答案 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();
}
});