我目前正在创建虚拟架子鼓。 Kinect正在记录我的动作,当我击打虚拟鼓时,程序需要播放该鼓的声音。目前,我播放音乐的代码如下:
void playInstrumentsound(InstrumentModel instrument) {
if (instrument.getMedia() != null) {
new Thread() {
public void run() {
instrument.setPlaying(true);
MediaPlayer player = new MediaPlayer(instrument.getMedia());
player.setVolume(1);
player.play();
try {
Thread.sleep(properties.getSleepLength());
} catch (InterruptedException e) {
e.printStackTrace();
}
instrument.setPlaying(false);
player.dispose();
}
}.start();
}
}
InstrumentModel是我的类,其中包含通过使用pathToSound(资源文件夹中.wav文件的路径)初始化的Media对象:
if (this.pathToSound != null) {
media = new Media(new File(this.pathToSound).toURI().toString());
}
现在这段代码没有达到我的期望,因为如果我敲鼓,那么就不能再为times.getSleepLength()时间值(现在大约为200ms)敲打它。如果我没有使Thread进入睡眠状态,那么我听不到完整的声音。
例如,如果.wav文件持续时间为300ms,并且我在playInstrumentsound()方法中制作了Thread.sleep(300),则我可以听到完整的声音,但是这300ms不能播放不同的声音。但是,如果我制作Thread.sleep(50),则几乎可以立即再次击中它,但是我只听到50ms的.wav文件。
我希望能够几乎立即击打鼓,但还能听到完整的声音。我怎样才能做到这一点?预先感谢。
编辑: 我只是想在playInstrumentsoundMethod内更改顺序:
void playInstrumentsound(InstrumentModel instrument) {
if (instrument.getMedia() != null) {
instrument.setPlaying(true);
MediaPlayer player = new MediaPlayer(instrument.getMedia());
player.setVolume(1);
player.play();
new Thread() {
public void run() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
instrument.setPlaying(false);
}
}.start();
new Thread() {
public void run() {
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
player.dispose();
}
}.start();
}
现在,它应该在250毫秒后关闭声音,并在50毫秒后更改isPlaying标志(如果isPlaying标志为true,则您无法再次击鼓)。您认为这可能有用吗?