如何一次播放一个.wav文件?

时间:2014-05-11 06:02:43

标签: java audio javax.sound.sampled

我想创建一个程序,在按下某个按钮时播放某个.wav文件。例如,JButton b1, b2, b3分别播放"Music1.wav""Music2.wav""Music3.wav",但一次只能播放一个wav文件。这就是我所做的,它在停止早期剪辑和导致两个或多个wav文件同时播放时遇到问题。

...   //imports the important stuff 
public class WAVButtons extends JFrame implements ActionListener
{
    private JButtons b1, b2, b3;
    private File[] sounds;

    public WAVButtons()
    {
         try
         {
               sounds = new File[]
                        {new File("Music1.wav"),
                         new File("Music2.wav"),
                         new File("Music3.wav")};
         }catch(Exception e)
         {
         }
         b1 = new JButton("play Music1");
         b2 = new JButton("play Music2");
         b3 = new JButton("play Music3");
         b1.addActionListener(this);
         b2.addActionListener(this);
         b3.addActionListener(this);
         ... //codes for GUI
    }

    public void actionPerformed(ActionEvent ae)
    {
         if(ae.getSource() == b1)
         { 
              playMusic1(true);
              playMusic2(false);
              playMusic3(false);
         }
         else if(ae.getSource() == b2)
         {
              playMusic1(false);
              playMusic2(true);
              playMusic3(false);
         }
         else if(ae.getSource() == b3)
         {
              playMusic1(false);
              playMusic2(false);
              playMusic3(true);
         }
    }

    public void playMusic1(boolean action)
    {
        try
        {
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[0]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            Clip clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            if(action)
            {
                clip.start();
                clip.loop(Clip.LOOP_CONTINUOUSLY);
            }
            else
                clip.stop();
        }catch (Exception e)
        {
        }
    }

    ... //playMusic2() and playMusic3() looks exactly the same as playMusic1(), except that the
        //parameter of AudioSystem.getAudioInputStream() is sounds[1] and sounds[2], respectively.
}

1 个答案:

答案 0 :(得分:1)

当你调用playMusic1(true)后跟playMusic1(false)时,第二个调用将创建一个剪辑的新实例,然后停止新实例。第一次通话创建的第一个实例将继续播放。您应该挂起对剪辑的引用,以便可以停止它。我也冒昧地删除了您的重复代码。

Clip clip;

public void actionPerformed(ActionEvent ae)
{
     if(ae.getSource() == b1)
     { 
          playMusic(0);
     }
     else if(ae.getSource() == b2)
     {
          playMusic(1);
     }
     else if(ae.getSource() == b3)
     {
          playMusic(2);
     }
}

public void playMusic(int clipNum)
{
    try
    {
        if (clip != null)
            clip.stop();

        if (action)
        { 
            AudioInputStream stream = AudioSystem.getAudioInputStream(sounds[clipNum]);
            AudioFormat format = stream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            clip = (Clip)AudioSystem.getLine(info);
            clip.open(stream);
            clip.start();
            clip.loop(Clip.LOOP_CONTINUOUSLY);
        }
    }catch (Exception e)
    {
    }
}