AudioSystem成功播放Clip,但只有一次- LineUnavailableException



我使用下面的Java代码在Raspberry PI上的USB声卡上播放声音:

try {
AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(someBinaryData));
Clip clip = AudioSystem.getClip(someMixerInfo);
clip.open(audioIn);
clip.start();
} catch(Exception exc) {
// debug stuff
}

,它工作得很好-但只有一次。当我尝试再次播放声音时,我得到一个异常:

javax.sound.sampled。LineUnavailableException:格式为PCM_SIGNED 44100.0 Hz, 16位,单声道,2字节/帧,不支持little-endian的行

无论我是想重放剪辑,还是播放另一个,都会抛出异常。

理想情况下,我希望能够同时播放多个声音,相互重叠。

可能是什么问题?

如果你想重放Clip,通常的方法是将帧位置设置回0,然后调用start。

Clip应该是一个实例变量,您只加载一次,并保存在内存中。

Clip clip;
public void loadClip() {
clip = ...
}
public void play() {
clip.setFramePosition(0);
clip.start();
}

IDK为什么你的代码不会播放第二次。也许其中一条线被绑住了,需要释放才能再次使用。通常AudioInputStreams是关闭的,当一个人完成他们。也许这与抛出异常的原因有关。但我不清楚,因为它看起来像你正在创建一个全新的实例。

不使用Clip#play(),我建议您使用Clip#loop(int)。例如:

clip.loop(0); //will play the clip once, you can play it again by calling loop(0) again
clip.loop(1); //will play, and play one more time after the clip ends (loops once)
clip.loop(Clip.LOOP_CONTINOUSLY); //will play forever.

同时,确保每个片段在不同的Thread中播放。

最新更新