我如何正确添加声音?

时间:2012-07-10 01:54:06

标签: java

好吧所以我正在处理我的程序,只要点击一个按钮就可以播放一首歌,我的代码已经关闭,单击按钮时我的音频正在播放,但现在唯一的问题是我的程序完全正常运行点击按钮时,只需播放音频!该程序只是冻结音频继续播放,但该程序将不会执行其他功能!我究竟做错了什么?我该如何解决?

继承了动作侦听器按钮的代码

myFrame.java中的

sound sound = new sound();
private File pokemonBattle = new File(".\\audio\\"+"sound.wav");


private void dualButtonActionPerformed(java.awt.event.ActionEvent evt)       
    {                                           
    // TODO add your handling code here:
    for (int i = 0; i<1; i++){
    c = deck.getNextCard();
    p1hand[i] = c;
    p1.setCard(c);                   //ignore all this
    c = deck.getNextCard();
    p2hand[i] = c;
    p2.setCard(c);
     }

    pokemon1.setEnabled(true);
    pokemon2.setEnabled(true);
    pokemon1.setIcon(p1hand[0].getImage()); //ignore all this as well
    pokemon2.setIcon(p2hand[0].getImage());
    textArea.setText("Pokemon 1:"+p1hand[0].toString()+"\nPokemon 2:   
 "+p2hand[0].toString());
    p1ResultLabel.setText("");
    p2ResultLabel.setText("");

      //this is where im calling my audio
     sound.playAudio(pokemonBattle);//this is where im calling my play audio method

 }

sound.java我有playAudio()

import java.io.File;
import javax.sound.sampled.*;



public class sound {

public void playAudio(File sf){
    AudioFormat audioFormat;
    AudioInputStream audioInputStream;
    SourceDataLine sourceDataLine;

    try
    {
        audioInputStream = AudioSystem.getAudioInputStream(sf);
        audioFormat = audioInputStream.getFormat();
        System.out.println(audioFormat);

        DataLine.Info dataLineInfo = new  
  DataLine.Info(SourceDataLine.class,audioFormat);

        sourceDataLine =(SourceDataLine)AudioSystem.getLine(dataLineInfo);

        byte tempBuffer[]=new byte[100000];
        int cnt;
        sourceDataLine.open(audioFormat);
        sourceDataLine.start();
        while((cnt=audioInputStream.read
                     (tempBuffer,0,tempBuffer.length))!=-1){
            if(cnt>0){
                sourceDataLine.write(tempBuffer,0,cnt);
            }

        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
        System.exit(0);
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您需要在单独的线程中播放音频。该程序没有响应,因为它正在event dispatch thread上播放您的音频而不是绘制用户界面并响应用户互动。

而不是:

sound.playAudio(pokemonBattle);

做的:

Thread t = new Thread( new SoundPlayer( sound, pokemonBattle );
t.start();

还有:

public class SoundPlayer implements Runnable
{
    private final sound sound;
    private final File soundFile;

    public SoundPlayer( sound sound, File soundFile )
    {
        this.sound = sound;
        this.soundFile = soundFile;
    }

    public void run()
    {
       sound.playAudio( soundFile );
    }
}

答案 1 :(得分:0)

约瑟夫是对的。但在这种情况下,问题是

 while((cnt=audioInputStream.read
                     (tempBuffer,0,tempBuffer.length))!=-1){
            if(cnt>0){
                sourceDataLine.write(tempBuffer,0,cnt);
            }

        }

你while循环将无限运行因此冻结你的应用程序。由于您一次读取和写入整个缓冲区,因此不需要while循环。在循环外做这个,你会没事的。