在Java中播放不同的声音文件

时间:2012-11-19 17:31:08

标签: java audio

我正在尝试在Java中的不同时间播放多个声音文件。我这样做是通过停止一个文件,然后在几秒钟后启动另一个文件。但是,每当我这样做时,只要我尝试切换文件,Java就会冻结或抛出错误。这是我用来播放不同文件的功能:

public void backgroundSound(String musicFile){
    System.out.println("1");
    if(this.clip!= null){
        if(this.clip.isRunning()){
            this.clip.close();
         }
    }
    System.out.println("2");
    try{
        File soundFile = new File(musicFile);
        AudioInputStream audioIn =
            AudioSystem.getAudioInputStream(soundFile);
        this.clip = AudioSystem.getClip();
        this.clip.open(audioIn); // line 538
        this.clip.start();
        this.clip.loop(Clip.LOOP_CONTINUOUSLY);
    }

    catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
      } catch (IOException e) {
     e.printStackTrace();
      } catch (LineUnavailableException e) {
     e.printStackTrace();
      }
}

任何帮助都将不胜感激。

使用this.clip.flush()代替this.clip.close()时,这是堆栈跟踪:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.
        at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:492)
        at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(DirectAudioDevice.java:1278)
        at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107)
        at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1059)
        at com.sun.media.sound.DirectAudioDevice$DirectClip.open(DirectAudioDevice.java:1149)
        at MyGame.backgroundSound(MyGame.java:538)
        at MyGame.actionPerformed(MyGame.java:161)
        at javax.swing.Timer.fireActionPerformed(Timer.java:291)
        at javax.swing.Timer$DoPostEvent.run(Timer.java:221)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:666)
        at java.awt.EventQueue.access$400(EventQueue.java:81)
        at java.awt.EventQueue$2.run(EventQueue.java:627)
        at java.awt.EventQueue$2.run(EventQueue.java:625)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:636)
        ...

0 个答案:

没有答案