Java .wav声音无法正常工作

时间:2017-03-08 13:29:05

标签: java audio wav

我在用java制作的游戏中遇到了声音问题。我有一个名为SoundSystem的类,其中包含名为Sound的对象,这是我正在读取声音文件的地方。这是您的摄影类Sound。

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文件,这是我发现的最佳方式,但这与我遇到的问题无关。

现在问题就在于此。如果我读了一个独特的声音或音乐,例如一个关卡开始时的声音或整个关卡的音乐,它就可以完全正常工作。在那种情况下我还没有找到问题。当播放重复的声音时,事情开始出错。说一个可以拍摄的拍摄声音,你可以每秒点击键盘,运动声音,爆炸声等等......这些声音在很多时候都有效,但有时却没有。拍摄声音变得更加明显,有时你甚至不会在几秒钟的持续射击中听到。有时甚至在关卡/游戏结束时的独特声音也将无效。但那个我不知道它与水平开始的原因或区别。

我尝试使用大胆切割来改变声音文件,或者在声音开始之前为声音添加额外的空间。我已经尝试通过在确定的时间设置它来弄乱帧速率。甚至改变他们阅读的方式,但无论我做什么,它总是持续存在并保持一致。

所以,如果您可能知道发生了什么或有任何建议随时回答。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,所以我通过创建相同声音的几个实例来解决这个问题。可能听起来很奇怪,所以我只是发布代码。

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,这对声音正常工作没有任何影响,我只是留下了评论......

无论如何,如果你现在遇到同样的问题,你就会知道什么可以解决它。对我来说就像一个魅力。最后,每秒钟完全听取所有这些镜头,哦,男人,感觉不好。

相关问题