【问题标题】:Play audio clips sequentially in JApplet在 JApplet 中按顺序播放音频片段
【发布时间】:2013-05-17 17:37:07
【问题描述】:

我正在尝试按顺序播放音频剪辑,但它们都同时播放。我不确定我做错了什么。能否请你帮忙。我正在使用 JFrame,这段代码给出了运行时错误。

AudioClip click;
AudioClip click2;

URL urlClick1 = DisplayMath.class.getResource("number11.wav");
click = Applet.newAudioClip(urlClick1);

URL urlClick2 = DisplayMath.class.getResource("number12.wav");
click2 = Applet.newAudioClip(urlClick2);

click.play();
click.notify();

try {
    click2.wait();
} 
catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
click2.play();

【问题讨论】:

    标签: java audio javasound japplet clip


    【解决方案1】:

    AudioClip 无法实现您想要实现的功能,但 Clip 附加了LineListener。请参阅在 2 个剪辑之间翻转的示例。

    import javax.sound.sampled.LineListener;
    import javax.swing.*;
    
    class TwoClips {
    
        public static void main(String[] args) throws Exception {
            URL url1 = new URL("http://pscode.org/media/100_2817-linear.wav");
            URL url2 = new URL("http://pscode.org/media/leftright.wav");
            final Clip clip1 = AudioSystem.getClip();
            clip1.open(AudioSystem.getAudioInputStream(url1));
            final Clip clip2 = AudioSystem.getClip();
            clip2.open(AudioSystem.getAudioInputStream(url2));
            LineListener listener = new LineListener() {
    
                Clip currentClip = clip1;
    
                @Override
                public void update(LineEvent event) {
                    if (event.getType() == LineEvent.Type.STOP) {
                        if (currentClip == clip1) {
                            currentClip = clip2;
                        } else {
                            currentClip = clip1;
                        }
                        currentClip.setFramePosition(0);
                        currentClip.start();
                    }
                }
            };
            clip1.addLineListener(listener);
            clip2.addLineListener(listener);
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    clip1.start();
                    JOptionPane.showMessageDialog(null, "Close me to exit!");
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 我有大约 5 个剪辑,我希望它们按顺序播放(只播放一次)。我的意思是我不希望剪辑播放超过一次。非常感谢
    • SourceDataLine 也可能比 Clip 更受欢迎,因为您只播放音频文件一次。 SDL 还支持 LineListener。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2010-10-11
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多