在线程上用Java播放音乐

我目前正在创建虚拟架子鼓。 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,则您无法再次击鼓)。您认为这可能有用吗?

liuyang0120 回答:在线程上用Java播放音乐

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3019305.html

大家都在问