Звук файла .wav останавливается в случайное время в JAVA

я пытаюсь сделать класс в java, который воспроизводит определенные звуки, но звуки останавливаются в случайные моменты, а не в конце. Почему это происходит? Заранее спасибо!

Вот мой код:

import java.io.File;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.swing.JDialog;
import javax.swing.JFileChooser;

public class CoreJavaSound extends Object implements LineListener {
File soundFile;

JDialog playingDialog;

Clip clip;

public static void main(String[] args) throws Exception {
PlayBow();

}

public CoreJavaSound(String fileName) throws Exception {
JFileChooser chooser = new JFileChooser();

soundFile = new File(fileName);


System.out.println("Playing " + soundFile.getName());

Line.Info linfo = new Line.Info(Clip.class);
Line line = AudioSystem.getLine(linfo);
clip = (Clip) line;
clip.addLineListener(this);
AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile);
clip.open(ais);
clip.start();
}

@Override
public void update(LineEvent le) {
LineEvent.Type type = le.getType();
if (type == LineEvent.Type.OPEN) {
  System.out.println("OPEN");
} else if (type == LineEvent.Type.CLOSE) {
  System.out.println("CLOSE");
  System.exit(0);
} else if (type == LineEvent.Type.START) {
  System.out.println("START");
  playingDialog.setVisible(true);
} else if (type == LineEvent.Type.STOP) {
  System.out.println("STOP");
  playingDialog.setVisible(false);
  clip.close();
}
}

public static void PlayBow() throws Exception
{
CoreJavaSound s = new CoreJavaSound("Bow.wav");
}
}

Все работает отлично, за исключением того, что звук перестает работать примерно через 1 секунду (при том, что файл 5 секунд)...


person René Claassens    schedule 15.10.2013    source источник


Ответы (1)


Клип запускается в фоновом потоке и не является блокирующим вызовом. Он играет в фоновом режиме. Таким образом, программа завершается, не позволяя клипу закончить воспроизведение.

Попробуйте что-то вроде этого:

  ...
  static boolean running = false;

  public static void main(String[] args) throws Exception {
    playBow();
    while(running) {
      Thread.sleep(200);
    }
  }
  ...
  @Override
  public void update(LineEvent le) {
    LineEvent.Type type = le.getType();
    if (type == LineEvent.Type.OPEN) {
      running = true;
      System.out.println("OPEN");
    } else if (type == LineEvent.Type.CLOSE) {
      System.out.println("CLOSE");
    } else if (type == LineEvent.Type.START) {
      System.out.println("START");
      playingDialog.setVisible(true);
    } else if (type == LineEvent.Type.STOP) {
      System.out.println("STOP");
      playingDialog.setVisible(false);
      clip.close();
      running = false;
    }
  }

Обратите внимание, что этот образец не является лучшим решением этой проблемы. Это просто пример.

person axiopisty    schedule 15.10.2013
comment
Это сработало отлично! Так глупо с моей стороны не думать об этом :p большое спасибо! - person René Claassens; 25.11.2013