Java .wav 声音无法正常工作
Java .wav sounds don't work properly
我在 java 制作的游戏中遇到声音问题。我有一个名为 SoundSystem 的 class,它包含名为 Sound 的对象,这是我正在读取声音文件的地方。这是供您接收的 class 声音。
package soundSystem;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class Sound {
private Clip clip;
private boolean isPlaying;
private boolean loop;
public Sound(boolean loop, String file){
this.loop = loop;
try {
clip = AudioSystem.getClip();
URL url = getClass().getResource(file);
AudioInputStream input = AudioSystem.getAudioInputStream(url);
clip.open(input);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean getIsPlaying(){
return isPlaying;
}
public void play(){
if(clip == null ) return;
clip.stop();
clip.flush();
clip.setFramePosition(1800);
clip.start();
}
public void close(){
clip.stop();
clip.close();
}
public void update(){
isPlaying = clip.isRunning();
if(!isPlaying){
if(loop)
play();
else
clip.stop();
}
}
}
如您所见,我将文件读取为 URL,因为我将项目导出为可运行的 Jar 文件,这是我发现的最佳方式,但与我遇到的问题。
问题来了。如果我读到一个独特的声音或音乐,例如一个关卡开始时的声音或播放整个关卡的音乐,它完全可以正常工作。在那种情况下,我还没有发现问题。当播放重复的声音时,事情就开始出错了。说一个你可以射击的声音,你可以每秒点击键盘,移动声音,爆炸声等等......这些声音很多时候有效,但有时却没有。射击声音变得更加明显,有时您甚至在连续射击几秒钟后都听不到。有时即使是 level/game 结束时的独特声音,也将不起作用。但是那个我不知道原因或它与关卡开始时的区别。
我试过在声音开始前通过大胆的剪辑或添加额外的 space 来改变声音文件。我尝试通过在确定的时间设置它来搞乱帧速率。即使改变他们的阅读方式,但无论我做什么,它始终存在并保持一致。
因此,如果您可能知道发生了什么或有任何建议,请随时回答。非常感谢任何帮助。
好的,所以我通过创建相同声音的多个实例解决了这个问题。可能听起来很奇怪,所以我只 post 代码。
package soundSystem;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class Sound {
private Clip[] clip;
private boolean isPlaying;
private boolean loop;
private int maxC;
private int c;
public Sound(boolean loop, String file, int nrReplications){
this.loop = loop;
maxC = nrReplications;
c = 0;
clip = new Clip[maxC];
try {
int i = 0;
while(i < maxC){
clip[i] = AudioSystem.getClip();
URL url = getClass().getResource(file);
AudioInputStream input = AudioSystem.getAudioInputStream(url);
clip[i].open(input);
++i;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean getIsPlaying(){
return isPlaying;
}
public void play(){
if(clip == null ) return;
if(c == maxC)
c = 0;
clip[c].stop();
//clip.flush();
clip[c].setMicrosecondPosition(0);
//clip.setFramePosition(0);
clip[c].start();
++c;
}
public void close(){
clip[c].stop();
clip[c].close();
}
public void update(){
isPlaying = clip[0].isRunning();
if(!isPlaying){
if(loop)
play();
else
clip[0].stop();
}
}
}
如您所见,我创建了一个 Clips 数组并在它们上面使用了一个计数器。独特的声音就像我之前说过的那样在 nrReplications 上被赋予了 1。但其他声音,如选择选项、爆炸、移动,给予 2+,玩家射击给予 5。在 5 时,我看不到质量有更多的提高,所以我就这样离开了。
同样值得注意的是,即使我删除了 flush();并在 play() 方法中将 framePosition 更改为 microSecondPosition,这对正常工作的声音没有影响,我只是留下他们的评论...
无论如何,如果您现在遇到同样的问题,您知道可以解决它的方法。对我来说就像一个魅力。终于听到所有这些每秒的镜头都完美地工作了,天哪,感觉很好。
我在 java 制作的游戏中遇到声音问题。我有一个名为 SoundSystem 的 class,它包含名为 Sound 的对象,这是我正在读取声音文件的地方。这是供您接收的 class 声音。
package soundSystem;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class Sound {
private Clip clip;
private boolean isPlaying;
private boolean loop;
public Sound(boolean loop, String file){
this.loop = loop;
try {
clip = AudioSystem.getClip();
URL url = getClass().getResource(file);
AudioInputStream input = AudioSystem.getAudioInputStream(url);
clip.open(input);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean getIsPlaying(){
return isPlaying;
}
public void play(){
if(clip == null ) return;
clip.stop();
clip.flush();
clip.setFramePosition(1800);
clip.start();
}
public void close(){
clip.stop();
clip.close();
}
public void update(){
isPlaying = clip.isRunning();
if(!isPlaying){
if(loop)
play();
else
clip.stop();
}
}
}
如您所见,我将文件读取为 URL,因为我将项目导出为可运行的 Jar 文件,这是我发现的最佳方式,但与我遇到的问题。
问题来了。如果我读到一个独特的声音或音乐,例如一个关卡开始时的声音或播放整个关卡的音乐,它完全可以正常工作。在那种情况下,我还没有发现问题。当播放重复的声音时,事情就开始出错了。说一个你可以射击的声音,你可以每秒点击键盘,移动声音,爆炸声等等......这些声音很多时候有效,但有时却没有。射击声音变得更加明显,有时您甚至在连续射击几秒钟后都听不到。有时即使是 level/game 结束时的独特声音,也将不起作用。但是那个我不知道原因或它与关卡开始时的区别。
我试过在声音开始前通过大胆的剪辑或添加额外的 space 来改变声音文件。我尝试通过在确定的时间设置它来搞乱帧速率。即使改变他们的阅读方式,但无论我做什么,它始终存在并保持一致。
因此,如果您可能知道发生了什么或有任何建议,请随时回答。非常感谢任何帮助。
好的,所以我通过创建相同声音的多个实例解决了这个问题。可能听起来很奇怪,所以我只 post 代码。
package soundSystem;
import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class Sound {
private Clip[] clip;
private boolean isPlaying;
private boolean loop;
private int maxC;
private int c;
public Sound(boolean loop, String file, int nrReplications){
this.loop = loop;
maxC = nrReplications;
c = 0;
clip = new Clip[maxC];
try {
int i = 0;
while(i < maxC){
clip[i] = AudioSystem.getClip();
URL url = getClass().getResource(file);
AudioInputStream input = AudioSystem.getAudioInputStream(url);
clip[i].open(input);
++i;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean getIsPlaying(){
return isPlaying;
}
public void play(){
if(clip == null ) return;
if(c == maxC)
c = 0;
clip[c].stop();
//clip.flush();
clip[c].setMicrosecondPosition(0);
//clip.setFramePosition(0);
clip[c].start();
++c;
}
public void close(){
clip[c].stop();
clip[c].close();
}
public void update(){
isPlaying = clip[0].isRunning();
if(!isPlaying){
if(loop)
play();
else
clip[0].stop();
}
}
}
如您所见,我创建了一个 Clips 数组并在它们上面使用了一个计数器。独特的声音就像我之前说过的那样在 nrReplications 上被赋予了 1。但其他声音,如选择选项、爆炸、移动,给予 2+,玩家射击给予 5。在 5 时,我看不到质量有更多的提高,所以我就这样离开了。
同样值得注意的是,即使我删除了 flush();并在 play() 方法中将 framePosition 更改为 microSecondPosition,这对正常工作的声音没有影响,我只是留下他们的评论...
无论如何,如果您现在遇到同样的问题,您知道可以解决它的方法。对我来说就像一个魅力。终于听到所有这些每秒的镜头都完美地工作了,天哪,感觉很好。