Java clip.open无限期挂起

时间:2016-06-21 06:11:58

标签: java audio hang javax.sound.sampled

我正在尝试打开.wav文件并使用Clip播放它。但是当我调用myClip.open(...)时,线程冻结并且永远不会恢复。没有错误被抛出。这是我的代码的简单版本:

try {
    AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));
    myClip = AudioSystem.getClip();
    myClip.open(mySound); //This is where it hangs
    myClip.start(); //This is never executed
} catch (Exception e) {e.printStackTrace();}

修改 我的代码的替代版本(也不起作用):

Clip myClip = null;

new Thread(new Runnable() {
     public void run() {
          try {
              AudioInputStream mySound = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));
              myClip = AudioSystem.getClip();
              System.out.println("Before open");
              myClip.open(mySound); //This is where it hangs
              System.out.println("After open"); //never executed
              //This thread runs indefinitely, whether or not clip.start() is called
          } catch (Exception e) {e.printStackTrace();}
     }
}).start();

try{  Thread.sleep(1000);  }catch(Exception e){} //give it a second to open

myClip.start(); //Executed, but doesn't make a sound
System.out.println("Started clip");

输出:

Before open
Started clip

我知道是什么导致这种情况,但我无法弄清楚线程永远冻结的方式。它会冻结,因为我的计算机上的声音驱动程序偶尔会停止工作,并防止任何程序发出任何声音。我只需要一些方法来强制clip.open方法(或线程)在大约2到3秒后超时。 在另一个线程中调用clip.start()可以正常工作,但由于剪辑尚未打开,因此不会播放声音。包含clip.open(...)的线程即使在调用clip.start()之后也会永远运行。

1 个答案:

答案 0 :(得分:0)

public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getAudioInputStream(new File("sounds/myAudioFile.wav"));       // you can pass it in url
        clip.open(inputStream);
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}

还有一点: 你还没有开始剪辑。 使用clip.start() 在这种情况下,您不必使用不同的线程作为clip.start()自己生成一个新线程。