在Java中播放不同的声音文件
我尝试在Java中不同的时间播放多个声音文件。我是通过停止一个文件,然后在几秒钟后启动另一个文件来实现的。然而,每当我这样做时,Java要么冻结,要么在我尝试切换文件时抛出错误。这是我用来播放不同文件的函数:在Java中播放不同的声音文件,java,audio,Java,Audio,我尝试在Java中不同的时间播放多个声音文件。我是通过停止一个文件,然后在几秒钟后启动另一个文件来实现的。然而,每当我这样做时,Java要么冻结,要么在我尝试切换文件时抛出错误。这是我用来播放不同文件的函数: public void backgroundSound(String musicFile){ System.out.println("1"); if(this.clip!= null){ if(this.clip.isRunning()){
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()时的堆栈跟踪:
你有具体的错误吗?java完全冻结在我身上并停止工作,因此很难确定具体的错误。但是,如果我将this.clip.close()更改为this.clip.flush(),java会在以下行抛出一个错误:this.clip.open(audioIn)当我更改音乐文件时,我们需要这个错误。你能在带有debug的IDE中运行它并查看堆栈跟踪吗?有关更具体的详细信息,我相信错误来自此.clip.close(),因为当我运行音乐文件时,它会在打印语句1和2之间冻结。下面是堆栈跟踪:
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)
...