【问题标题】:AudioSystem successfully plays Clip, but only once - LineUnavailableExceptionAudioSystem 成功播放剪辑,但只播放一次 - LineUnavailableException
【发布时间】:2021-03-16 05:13:35
【问题描述】:

我正在使用以下 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。

无论我是想重播剪辑还是播放其他剪辑,都会引发异常。

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

可能是什么问题?

【问题讨论】:

    标签: java raspberry-pi javasound


    【解决方案1】:

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

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

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

    IDK 正是您的代码无法第二次播放的原因。也许其中一条线以某种方式被捆绑并且需要释放才能再次使用。通常AudioInputStreams 完成后会关闭。也许这与引发异常的原因有关。但我不清楚,因为看起来您正在创建一个全新的实例。

    【讨论】:

    • 该异常不仅在尝试重播Clip 时引发,而且在尝试播放完全不同的Clip 时也会引发。另外,我应该如何释放线路?最后,理想的情况是我可以一次播放多个不同的剪辑,彼此重叠,而不是等待一个完成。
    • 如需更好的帮助,请edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。如果可能,热链接到声音文件,或在运行时生成一个(例如简单的正弦波)。
    • 同意 Andrew Thompson 的观点,MRE 会有所帮助。 @mag_zbc 我无法智能地回复您的评论,因为没有新信息并且它没有表明是否尝试了所描述的位置重置。对于多个剪辑播放,请区分您是希望同时播放相同的剪辑/声音效果,还是同时播放独特的声音存在此问题。如果是后者,可能需要混合到单个输出,由 TinySound 或 github 上的 AudioCue 库提供。 AudioCue 还允许同时播放单个剪辑,并以剪辑为模型。
    • 通过添加线路监听器并释放线路解决了无法再次播放任何剪辑的问题,但真正的诀窍是您的 AudioCue 库,它正是我需要的。跨度>
    • 很高兴听到!您是我认识的第一个将它与 Raspberry PI 一起使用的人。很高兴听到它在那里工作。很想在某个时候听到更多关于您的项目的信息。
    【解决方案2】:

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

    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 播放每个剪辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多