当WAV包含在JAR中时,如何在Java中播放WAV

当WAV包含在JAR中时,如何在Java中播放WAV,java,audio,applet,javasound,Java,Audio,Applet,Javasound,我已经尝试在我的Applet上处理声音有一段时间了,与其尝试所有不同的方法,在Java中播放声音的最佳方式是什么?有几个要求: 需要能够循环 需要能够从归档JAR加载WAV(我认为使用getClass().getResource) 需要能够同时播放多个声音,而不是剪辑已经播放的声音 非常感谢你们看我的问题,我希望你们有答案 多亏了他们的大力帮助,我几乎可以做到: public class MyGame() { Clip bullet; public void init(){

我已经尝试在我的Applet上处理声音有一段时间了,与其尝试所有不同的方法,在Java中播放声音的最佳方式是什么?有几个要求:

  • 需要能够循环
  • 需要能够从归档JAR加载WAV(我认为使用getClass().getResource)
  • 需要能够同时播放多个声音,而不是剪辑已经播放的声音
非常感谢你们看我的问题,我希望你们有答案

多亏了他们的大力帮助,我几乎可以做到:

public class MyGame() {
   Clip bullet;


    public void init(){
        try {

        bullet = AudioSystem.getClip();
        URL url2 = this.getClass().getResource("bulletSound.wav");
        AudioInputStream ais2 = AudioSystem.getAudioInputStream( url2 );

        bullet.open(ais2);
        } catch (LineUnavailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
    randomMethodToPlayBullet(){
        bullet.setFramePosition(0);
        bullet.start();
    }
}
问题是子弹声会播放,但如果在第一个子弹声发出之前,RandomMethodToPlayball连续调用两次,则seonc one不会播放。

以下问题的答案:

  • 小样本是
    Clip
    。有关使用示例,请参见
  • 大样本是必要的

从jar文件加载资源的最佳方法是将类放在同一文件夹中,并使用
.class.getResource(…)
.class.getResourceaAsStream(…)
方法获取资源:

URL url = ClazzInTheFolderOfMyMidiFile.class.getResource(nameOfMidiFile);


不能同时播放同一剪辑两次。必须创建另一个剪辑实例才能同时播放两次声音


请注意,您可以播放的剪辑数量是有限制的,因此剪辑API可能不适合支持声音沉重的游戏。

这看起来非常适合播放这些剪辑,但您介意快速解释一下我将如何从JAR而不是通过URL加载它们吗?好的,我用我现在拥有的内容更新了我的帖子,现在我只有最后一个问题,在帖子中提到。等等,我想用哪种方法?这两行之间有什么区别?我已经纠正了这个例子,这是两个不同的变体。您可以获取url或直接获取流,这取决于用于处理资源的API。我几乎让它完全工作了!除了我这样做是为了播放子弹声(在帖子中编辑),但它只播放一次。这是一个很好的分离问题的方法。从jar文件播放midi和循环播放,属于不同的thema。这不利于改变问题的主题:)“从jar文件加载资源的最佳方法是将类放在同一文件夹中”,我不同意。1) 通常,将资源放在单独的Jar中是有意义的。这样,可以分别更新资源或类,并为不同的应用程序外观提供不同的资源jar。2) 它在应用程序中运行。是可信的,并且资源使用相同的结构,它们也需要签名。3) 这会导致“同一个包中的资源由不同的签名者签名”这样的安全错误——相反,请将它们放在最适合它们的路径中,并在路径前面加上前缀
/
。我想提供帮助,但“SSCCE”中是否有您不理解的部分?SSCCE不需要3个片段实例来显示循环1个实例的失败。还有其他因素。请阅读我在前一篇文章中链接的文章。SSCCE应该包括进口。它应该是小程序(或servlet)或包含
main()
。。请仔细阅读这篇文章。非常感谢,我应该用什么来代替呢?看看java.sound.sampled包(这就是Clip在引擎盖下使用的东西)。需要注意的是,它需要更多的样板代码才能完成任务,并且可能无法立即直观地使用(具有更大的灵活性,例如平衡和音量控制)。它还允许您以编程方式生成声音(例如,将多个声音混合到同一频道)。只要你对剪辑满意,它的使用就简单多了,这取决于你需要对声音的控制程度。。。
InputStream resourceAsStream = ClazzInTheFolderOfMyMidiFile.class.getResourceAsStream(nameOfMidiFile);