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

问题描述

我正在使用以下 Java 代码在我的 RaspBerry PI 上的 USB 声卡上播放声音:

restore()

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

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

无论我是想重播剪辑还是播放不同的剪辑,都会引发异常。

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

可能是什么问题?

解决方法

如果要重放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 中播放每个剪辑。