我如何在Java中的方法中播放音频文件,但是当再次调用该方法时,之前的音频文件是否停止播放?

时间:2013-11-28 05:14:17

标签: java audio javasound

所以我正在尝试制作一个吉他模拟器,如果我调用一个方法,那个音符会播放。但是,当我再次呼叫它时,之前的声音停止播放。

    public class ytst {
         public static void main(String[] args)throws Exception {
             Estring.play(1);
             TimeUnit.SECONDS.sleep(3);
     Estring.play(2);
    }
    ----------
    class Estring{
         public static play(int fret){
            String filename="E" + fret + ".wav"
            File soundFile = new File(filename);
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
            Clip clip = AudioSystem.getClip();
            clip.open(audioIn);
            clip.start();
         }
    }

当我尝试这个时,第二个音频文件与第一个音频文件重叠。我怎么能这样做,当我再次调用这个方法时,前一个声音文件停止播放?

1 个答案:

答案 0 :(得分:1)

剪辑旨在保存可重复使用的声音。在它们播放之前,必须将整个.wav文件加载到内存中。这可能会产生滞后问题。 SourceDataLines将更快地开始播放,因为它们在开始播放之前只加载缓冲区的数据。

之后,它们已经加载到内存中,启动或重新启动它们。由于它们是从内存运行的,所以没有像SourceDataLines那样发生昂贵的文件加载。因此,如果您要使用剪辑,请考虑首先初始化所有剪辑。如果这会消耗太多内存,我会坚持使用SourceDataLines,至少在你的应用程序的第一次传递,然后尝试任何想要优化的东西。

要停止剪辑,您所要做的就是调用clip.stop()。我会考虑做一些事情,比如创建一个名为currentClip的变量,然后用这个方法停止它,然后用你希望播放的新音符的值重新分配它。如果currentClip是易失性的,即使在不同的线程上播放各种音符,它也应该快速响应。

使用SourceDataLine,您可以执行相同的操作,但关闭SourceDataLine会更复杂一些。一种常见的策略是将一个不稳定的“播放”布尔值作为最内层while循环中的条件。您可以将“播放”变量设置为false,并且假设您已正确编写了sourceDataLine线程将关闭 - 在Java教程中,Sound部分有很好的例子。