如何在一定时间内暂停剪辑/对象?

时间:2014-11-23 06:30:50

标签: java audio clip

您好Stackoverflow!

基本上,我的Java程序中有两个音频片段,我希望其中一个在某个时间停止,另一个在某个时间开始。

我会尽力解释代码。 http://pastebin.com/1zGdb30x Music.java

    package testingground;


import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;


public class Music {
    public void musictwo() {
        URL url;
        try {
            url = new URL("file:///D:/Yes/GUI/song.wav");
             Clip clip = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.
              getAudioInputStream( url );
            clip.open(ais);
            clip.loop(100);

        } catch (UnsupportedAudioFileException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    public void musicone() {
        URL url;
        try {
            url = new URL("file:///D:/Yes/GUI/rival.wav");
            Clip clip = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.
              getAudioInputStream( url );
            clip.open(ais);
            clip.loop(100);
        } catch (UnsupportedAudioFileException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

http://pastebin.com/nGm4DZfr Program.java

package testingground;

import javax.swing.JOptionPane;

public class Program {
    public static void main(String[] args) {
        System.out.println("The first song should play now!");
        Music a = new Music();
        a.musicone();
        System.out.println("The second song should play now!");
        a.musictwo();
        JOptionPane.showMessageDialog(null,"Press 'ok' to end the application.");
    }
}

在Music.java中,我有音频文件工作,它们只是本地.wav文件,只能在我的电脑上使用。在program.java中,输出是musicone,musictwo同时播放。有没有办法使麝香酮发挥,停止,然后musictwo播放?

我尝试过的事情 - - 在program.java中有一个if和else语句来执行clip.stop()。没有错误,它只是没有工作。 - 从program.java中获取if和else boolean,以在Music.java中执行clip.stop()。没有语法错误,它只是没有用。

1 个答案:

答案 0 :(得分:1)

我理解您的问题的方式,您可以使用LineListener

只是,例如,这是一个通过List的类,每次当前完成时播放下一个流:

class Playlist implements LineListener {
    private final List<AudioInputStream> list = new ArrayList<>();
    private Clip clip;
    private int next;

    @Override
    public void update(LineEvent evt) {
        if(evt.getType() == LineEvent.STOP) {
            try {
                playNext();
            } catch(LineUnavailableException | IOException e) {
                e.printStackTrace();
            }
        }
    }

    void enqueue(AudioInputStream ais) {
        synchronized(this) {
            list.add(ais);
        }
    }

    void playNext() throws LineUnavailableException, IOException {
        synchronized(this) {
            if(list.isEmpty()) {
                throw new IllegalStateException();
            }
            if(clip != null) {
                if(clip.isRunning()) clip.stop();
                if(clip.isOpen()) clip.close();
            }

            clip = AudioSystem.getClip();
            clip.addLineListener(listener);
            try {
                clip.open(list.get(next));
            } finally {
                next = (next + 1) % list.size();
            }
            clip.start();
        }
    }
}