作爲每.start()
方法的Javadoc:
允許一行從事數據I/O。如果在已經運行的行 上調用,則此方法不執行任何操作。除非 緩衝區中的數據已被清空,否則該行將從線路停止時未處理的第一個 幀開始恢復I/O。當開始錄音或回放 時,會生成START事件。
沒有提及以異步方式播放音頻。這意味着您的聲音將通過調用start
方法的線程來處理,因爲您在事件處理程序中調用它,最終意味着您的Event Dispatching Thread
正在照顧播放音頻。
此線程還負責在屏幕上繪製東西,所以在其上運行的其他任何東西,音頻都會對您的渲染產生負面影響。
您可以使用下面的一些代碼(取自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();
}
}
}
哦,好吧,這是很可以理解的謝謝! – Bango
@Bango:很高興這有幫助。在處理用戶界面時,通常會產生可能需要的任何其他任務的線程,這樣您就不會讓繁忙的東西變得繁忙:)。 – npinti
我所做的只是把新的聲音()放在主類lol – Bango