我试图在网上搜索资源非常有限。在执行方法中执行:
actionPerformed(){
---------------
new Sound();}
并在Sound类中
public Sound(){
try {
String filePath="path\\file.wav";
File path= new File(filePath);
AudioInputStream stream;
AudioFormat format;
DataLine.Info info;
Clip clip;
stream = AudioSystem.getAudioInputStream(path);
format = stream.getFormat();//becomes formatted
info = new DataLine.Info(Clip.class, format);// info
clip = (Clip) AudioSystem.getLine(info);// casting for clip
clip.open(stream); // clip opens stream with path
clip.start();
}
catch (Exception e) {
System.out.println("errors");
}
}
谢谢。
答案 0 :(得分:2)
根据.start()
方法的Javadoc:
允许线路参与数据I / O.如果在一行上调用 已经运行,这个方法什么也没做。除非数据在 缓冲区已被刷新,该行从第一个开始恢复I / O. 线路停止时未处理的帧。什么时候 音频捕获或播放开始,生成START事件。
没有提到以异步方式播放音频。这意味着您的声音将由调用start
方法的线程处理,因为您在事件处理程序中调用它,最终将意味着您的Event Dispatching Thread
负责播放音频。< / p>
此线程还负责在屏幕上绘制内容,因此在其上运行的任何其他内容(在您的情况下为音频)将对渲染产生负面影响。
您可以使用下面的代码(取自here)来使您的音频在单独的线程上播放。这应该迎合你的滞后问题。
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AePlayWave extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position {
LEFT, RIGHT, NORMAL
};
public AePlayWave(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public AePlayWave(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
public void run() {
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
答案 1 :(得分:0)
您可能想要查看轻量级Java游戏库的OpenAL绑定。
当我不得不用大量声音文件编写游戏时,它对我来说非常好。
除此之外,Clips因为某个原因被命名为Clips;它们应该是非常简短和非常小的,因为它们是加载而不是实时流式传输。
LWJGL: http://www.lwjgl.org/