【问题标题】:How to play .wav files one at a time?如何一次播放一个 .wav 文件?
【发布时间】:2014-05-13 14:20:32
【问题描述】:

我想创建一个程序,在按下某个按钮时播放某个 .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.
}

【问题讨论】:

    标签: java audio javax.sound.sampled


    【解决方案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)
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多