loops - 声音循环播放或仅播放一次

标签 loops audio

好的,所以我在以最有效的方式播放wav声音时遇到了问题。如果我摆脱了Audio类中的'clip.setFramePosition',那么声音就会循环播放(显然是因为剪辑不断地反转回到第0帧)。如果我取消了'clip.setFramePosition'方法,则声音仅播放一次,并且仅播放一次(可能是因为需要将其设置回其原始帧位置)。

涉及两个类:

/**
 * Initalise sound clips
 */

public static Clip reverb = loadClip("/SFX_Intro/reverb.wav");
public static Clip glitch = loadClip("/SFX_Intro/glitch.wav");
public static Clip menu = loadClip("/SFX_Ambience/menu.wav");

/*
 * audio input to enable sound
 */

private static AudioInputStream ais;

/**
 * load sound clip
 */

private static Clip loadClip(String resourceName) {
    try {
        ais = AudioSystem.getAudioInputStream(Audio.class.getResource(resourceName));
        DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());

        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(ais);

        return clip;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

/**
 * play sound clip
 */
public static void play(Clip clip) {
    if (clip != null) {
        try {
            clip.rewind();
            clip.setFramePosition(0);
            clip.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * loop sound
 */

public static void loop(Clip clip, int amount) {
    if (clip != null) {
        try {
            clip.loop(amount);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * Stop sound
 */

public static void stop(Clip clip) {
    clip.stop();
}

和...
/**
 * alpha vars
 */

private int alpha = 220;
private final int MIN_ALPHA = 0;
private Color c;
private Rectangle r;

/**
 * class importations
 */

private Counter[] delay;

/**
 * Constructor
 */

public Intro(GameStateManager gsm) {
    super(gsm);

    delay = new Counter[3];
    delay[0] = new Counter();
    delay[1] = new Counter();
    delay[2] = new Counter();
}

/**
 * Update
 */

public void update() {
    Cursor.setCursor(Cursor.INVISIBLE);
}

/**
 * Draw
 */

public void draw(Graphics2D g) {

    delay[2].count(2);

    if (delay[2].bFinished) {

        r = new Rectangle(0, 0, GamePanel.WIDTH, GamePanel.HEIGHT);
        c = new Color(0, 0, 0, alpha);

        g.drawImage(Texture.plogo_01, GamePanel.WIDTH / 2
                - Texture.plogo_01.getWidth() / 2, GamePanel.HEIGHT / 2
                - Texture.plogo_01.getHeight() / 2, null);

        if (alpha != MIN_ALPHA) {
            alpha -= 1;
        }

        else if (alpha == MIN_ALPHA) {  // Once faded in...

            g.drawImage(Texture.plogo_02, GamePanel.WIDTH / 2
                    - Texture.plogo_02.getWidth() / 2, GamePanel.HEIGHT / 2
                    - Texture.plogo_02.getHeight() / 2, null);
            delay[0].count(0.005);  // set delay time
            Audio.play(Audio.glitch);  // Play glitch sound 
        }

        if (delay[0].bFinished) {  // Once delay time has finished...

            g.setColor(Color.BLACK);
            g.fill(r);
            delay[1].count(3);  // set another delay time
            if (delay[1].bFinished) {
                gsm.setState(GameStateManager.MENU);  // change to menu state
                return;
            }
        }
        g.setColor(c);
        g.fill(r);
    }
}

/**
 * Key input
 */

public void keyPressed(int key) {
}

public void keyReleased(int key) {
}

我希望有人可以帮助解决这个问题。先感谢您。

最佳答案

解决了。我在“播放”方法中添加了“如果”语句:

public static void play(Clip clip) {
    try {
        clip.start();

        int MAX_FRAMES = clip.getFrameLength();
        if (clip.getFramePosition() == MAX_FRAMES) {
                clip.setFramePosition(0);
                stop(clip);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return;
}

关于loops - 声音循环播放或仅播放一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25444808/

相关文章:

python - 确保角度小于 360 度的简单循环 [Python]

c# - 循环 LINQ 查询并将结果追加到 DataTable

javascript - 将 map 连接到 json 文件 for 循环

android - 如何在android中录制音频m4a格式的音频文件?

javascript - 创建一个HTML 5音频播放器

c++ - 返回第 k 个最小元素的函数

java - 在批处理文件中运行多个 jar 文件

audio - 如何对重新采样的音频数据进行双三次(或其他非线性)插值?

linux - 如何使用 ffplay 和 youtube-dl 在终端中播放 youtube 歌曲

audio - 如何实时处理音频?