Java 声音在我停止后不起作用
Java sound doesn't work after I stop it
这只是测试文件,我有我的声音 class,我正在从另一个主 class 调用它。它播放了 3 秒,然后停止,然后不再播放。可能是什么问题?
这让我发疯。
声音Class
public class Sound {
private static URL url1, url2, url3, url4;
private static AudioClip gun, boom;
private static Clip menuClip, gameClip;
private static AudioInputStream menu, game;
public static boolean menuPlaying, gamePlaying, explosionOn;
public Sound() {
menuPlaying = false;
gamePlaying = false;
url1 = Sound.class.getResource("/laserSound.wav");
url2 = Sound.class.getResource("/boom.wav");
url3 = Sound.class.getResource("/adventure.wav");
url4 = Sound.class.getResource("/adventure.wav");
gun = Applet.newAudioClip(url1);
boom = Applet.newAudioClip(url2);
try {
game = AudioSystem.getAudioInputStream(url4);
//menu = AudioSystem.getAudioInputStream(url3);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void playGunSound() {
gun.play();
}
public void stopGunSound() {
gun.stop();
}
public void playExplosion() {
boom.stop();
boom.play();
}
public void stopExplosion() {
boom.stop();
}
public void playGameMusic() throws LineUnavailableException {
if (gamePlaying == false) {
gameClip = AudioSystem.getClip();
try {
gameClip.open(game);
} catch (
LineUnavailableException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
gameClip.start();
gameClip.loop(Clip.LOOP_CONTINUOUSLY);
gamePlaying = true;
}
}
public void stopGameMusic() {
gameClip.stop();
gamePlaying = false;
}
}
主要方法
public static void main(String[] args) throws LineUnavailableException, InterruptedException {
Sound sound = new Sound();
sound.playGameMusic();
TimeUnit.SECONDS.sleep(3);
sound.stopGameMusic();
TimeUnit.SECONDS.sleep(3);
sound.playGameMusic();
}
代码现在的样子,有一些奇怪的东西需要清理。
首先,最好将 gameClip.open 放在单独的方法中。您只需打开一次 Clip。只要不关闭,就可以随意启动和停止。就目前而言,每次播放都会打开剪辑,每次执行此操作时,都必须在播放剪辑之前将整个声音文件加载到内存中。这违背了 Clip 对象的目的。
其次,开始后跟循环是多余的。两者都会播放剪辑。如果要连续循环播放,直接调用loop方法即可,不用start。
清理完这两件事后,让我们重新访问代码,看看问题是否消失了。我不清楚发生的问题是由于特定错误还是您的两个冗余代码操作之一造成了 undefined/unexpected 情况。
你看过剪辑 API 了吗?
我对 AudioClip 没有经验。但是我已经成功地使用了 Clip。
这只是测试文件,我有我的声音 class,我正在从另一个主 class 调用它。它播放了 3 秒,然后停止,然后不再播放。可能是什么问题?
这让我发疯。
声音Class
public class Sound {
private static URL url1, url2, url3, url4;
private static AudioClip gun, boom;
private static Clip menuClip, gameClip;
private static AudioInputStream menu, game;
public static boolean menuPlaying, gamePlaying, explosionOn;
public Sound() {
menuPlaying = false;
gamePlaying = false;
url1 = Sound.class.getResource("/laserSound.wav");
url2 = Sound.class.getResource("/boom.wav");
url3 = Sound.class.getResource("/adventure.wav");
url4 = Sound.class.getResource("/adventure.wav");
gun = Applet.newAudioClip(url1);
boom = Applet.newAudioClip(url2);
try {
game = AudioSystem.getAudioInputStream(url4);
//menu = AudioSystem.getAudioInputStream(url3);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void playGunSound() {
gun.play();
}
public void stopGunSound() {
gun.stop();
}
public void playExplosion() {
boom.stop();
boom.play();
}
public void stopExplosion() {
boom.stop();
}
public void playGameMusic() throws LineUnavailableException {
if (gamePlaying == false) {
gameClip = AudioSystem.getClip();
try {
gameClip.open(game);
} catch (
LineUnavailableException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
gameClip.start();
gameClip.loop(Clip.LOOP_CONTINUOUSLY);
gamePlaying = true;
}
}
public void stopGameMusic() {
gameClip.stop();
gamePlaying = false;
}
}
主要方法
public static void main(String[] args) throws LineUnavailableException, InterruptedException {
Sound sound = new Sound();
sound.playGameMusic();
TimeUnit.SECONDS.sleep(3);
sound.stopGameMusic();
TimeUnit.SECONDS.sleep(3);
sound.playGameMusic();
}
代码现在的样子,有一些奇怪的东西需要清理。
首先,最好将 gameClip.open 放在单独的方法中。您只需打开一次 Clip。只要不关闭,就可以随意启动和停止。就目前而言,每次播放都会打开剪辑,每次执行此操作时,都必须在播放剪辑之前将整个声音文件加载到内存中。这违背了 Clip 对象的目的。
其次,开始后跟循环是多余的。两者都会播放剪辑。如果要连续循环播放,直接调用loop方法即可,不用start。
清理完这两件事后,让我们重新访问代码,看看问题是否消失了。我不清楚发生的问题是由于特定错误还是您的两个冗余代码操作之一造成了 undefined/unexpected 情况。
你看过剪辑 API 了吗?
我对 AudioClip 没有经验。但是我已经成功地使用了 Clip。