在一次开发小工具的过程中,需要使用java调用音频文件,并且需要多次调用同一个音频文件时,需要注意的问题:
1.AudioInputStream和Clip使用后需要关闭
2.AudioInputStream和Clip关闭后需要将对象重置为null,否则后续运行会报异常
3.如果音频文件时间很短,loop最好设置Clip.LOOP_CONTINUOUSLY让音频文件无限循环
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
/**
* @author syrss
*/
public class AlertSound {
private static AudioInputStream audioInputStream = null;
private static Clip clip = null;
public static void alertSound() {
try {
if (audioInputStream == null) {
String ringPath = System.getProperty("user.dir") + "\\ring.wav";
audioInputStream = AudioSystem.getAudioInputStream(new File(ringPath));
}
AudioFormat format = audioInputStream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
if (clip == null) {
clip = (Clip) AudioSystem.getLine(info);
}
clip.open(audioInputStream);
clip.addLineListener((e) -> {
if (e.getType() == LineEvent.Type.STOP) {
clip.drain();
clip.close();
clip = null;
try {
audioInputStream.close();
audioInputStream = null;
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
});
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
public static void stopSound() {
clip.stop();
}
}
说的不够详细的地方,欢迎大家指正交流。