如何在方法之外制作剪辑?

How do I make a clip outside of method?

我创建了一个在调用时启动或停止音乐的方法,但如果我多次调用它,它会启动一个重复的剪辑。我找不到如何在变量之外制作音频剪辑变量来防止这种情况。

    public static void playSound(boolean play) throws Exception {
    File sound = new File("wave.wav");
    Clip clip = AudioSystem.getClip();
    if(play=true) {
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
        inputStream = AudioSystem.getAudioInputStream(sound);
        clip.open(inputStream);
        clip.loop(Clip.LOOP_CONTINUOUSLY);
        clip.start();
    } else if (play=false) {
        clip.stop();
    }
}

更新: 因此,经过几个小时的尝试,我决定将启动音乐的代码放在 main 方法中,将 clip 变量设为静态(这样 eclipse 就会让我在事件中使用它),然后使用 clip.stop() on事件。只是想我会分享。

您的直接问题是 if(play=true) {,这是将 play 设置为 true,因此每次都会重新打开剪辑并重新开始播放。

您应该使用 if(play==true) { 来确定 play 的值是否为 true,但您也可以使用 if(play) {

查看 The if-then and if-then-else Statements 了解更多详情。

本质上,=是赋值==是求值。 if 条件必须等于布尔值 (true/false),因此在使用布尔值时,您不必使用 ==,您可以直接使用该值本身。

假设 playtrueif (play == true)if (play) 都将计算为 true

话虽如此,一旦你初始化并打开剪辑,你就不需要 re-open 再次开始播放时,例如...

public class Track {
    private Clip clip;
    private File source;

    public Track(File source) {
        this.source = source;
    }

    public static void playSound(boolean play) throws Exception {
        File sound = new File("wave.wav");
        Clip clip = AudioSystem.getClip();
        if (play = true) {
            AudioInputStream inputStream = AudioSystem.getAudioInputStream(sound);
            inputStream = AudioSystem.getAudioInputStream(sound);
            clip.open(inputStream);
            clip.loop(Clip.LOOP_CONTINUOUSLY);
            clip.start();
        } else if (play = false) {
            clip.stop();
        }
    }

    public File getSource() {
        return source;
    }

    public Clip getClip() {
        return clip;
    }

    public void play() throws LineUnavailableException, UnsupportedAudioFileException, IOException {
        if (clip == null) {
            AudioInputStream inputStream = AudioSystem.getAudioInputStream(getSource());
            inputStream = AudioSystem.getAudioInputStream(getSource());
        }
        if (!clip.isOpen()) {
            clip.open();
        }
        clip.loop(Clip.LOOP_CONTINUOUSLY);
        clip.start();
    }
    
    public void stop() {
        if (clip == null) {
            return;
        }
        if (!clip.isActive()) {
            return;
        }
        clip.stop();
        clip.setFramePosition(0);
    }
}

事实上,您还可以轻松地添加对暂停的支持,方法是

public void pause() {
    if (clip == null) {
        return;
    }
    if (!clip.isActive()) {
        return;
    }
    clip.stop();
}

(ps - 我没有添加关闭方法,这也很有用)

除了更完整的答案外,还可以让语句读起来像

if(play)
{
    // Play code
}
else
{
    clip.stop();
}

而不是

if(play == true)
{
    // Play code
}
else if(play == false)
{
    clip.stop();
}

是更好的风格。

编辑以获取更多信息

要回答问题的标题,

How do I make a clip outside of method?

我相信您是在问如何格式化 class-level 变量。这需要满足以下条件:

  • 访问修饰符,需要 -- 默认(当你什么都不输入时),public,protected,private
  • final 关键字,可选 -- 用于限制用户
  • static 关键字,可选 -- 用于内存管理
  • 数据类型,需要--指定变量可以存储的不同大小和值
  • name, need -- 如何调用或引用变量。不能在保留关键字列表中

使用与此调用相同的 class:Clip clip = AudioSystem.getClip();,您可以创建一个空的 class-level 变量:

private static Object objectName; 

链接