Java AudioSystem成功播放该剪辑,但仅播放一次LineUnavailableException

Java AudioSystem成功播放该剪辑,但仅播放一次LineUnavailableException,java,raspberry-pi,javasound,Java,Raspberry Pi,Javasound,我正在使用以下Java代码在我的Raspberry PI上的USB声卡上播放声音: try { AudioInputStream audioIn = AudioSystem.getAudioInputStream(new ByteArrayInputStream(someBinaryData)); Clip clip = AudioSystem.getClip(someMixerInfo); clip.open(audioIn); clip.start(); }

我正在使用以下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_签名44100.0 Hz、16位、单声道、2字节/帧、不支持小尾端的行

无论我是想重播该剪辑还是播放另一个剪辑,都会引发异常

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


可能是什么问题?

如果要重播
剪辑,通常的方法是将帧位置设置回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.

另外,请确保在不同的
线程中播放每个剪辑

该异常不仅在尝试重播
剪辑
时引发,而且在尝试播放完全不同的剪辑时也会引发。另外,我应该如何发布该行?最后,理想的情况是,我可以同时播放多个不同的剪辑,彼此重叠,而不是等待一个剪辑完成。为了更快地获得更好的帮助,请添加一个或。如果可能,热链接到声音文件,或者在运行时生成一个声音文件(例如,一个简单的正弦波)。同意Andrew Thompson的意见,MRE会很有帮助@mag_zbc我无法明智地回应您的评论,因为没有新的信息,也没有说明是否尝试了所述的职位重置。对于多个剪辑回放,请区分您是否希望同时播放相同的剪辑/声音效果,或者是否存在此问题,同时播放唯一的声音。如果是后者,可能需要混合到单个输出,如github上的TinySound或AudioCue库所提供的那样。AudioCue还允许同时播放单个剪辑,并以该剪辑为模型。通过添加一个线路侦听器并释放线路,解决了无法再次播放任何剪辑的问题,但真正起作用的是您的AudioCue库,它正是我所需要的。非常高兴听到!你是我认识的第一个用它搭配覆盆子皮的人。很高兴听到它在那里工作。希望有机会听到更多关于你的项目。