我有一种播放声音的方法。它第一次工作,但在第二次播放时我听不到声音。 首先,我在构造函数中实例化了AudioInputStream:
private AudioInputStream audio;
public AudioTest() {
try {
audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile());
} catch (UnsupportedAudioFileException | IOException e) {
}
}
播放声音的方法:
private void play() {
try {
Clip clip = AudioSystem.getClip();
clip.open(audio);
clip.setFramePosition(0);
clip.start();
} catch (LineUnavailableException | IOException e) {
}
}
我第一次听到音频而不是第二次听到音频。为什么呢?
答案 0 :(得分:0)
首先尝试关闭Clip
:
clip.close();
答案 1 :(得分:0)
也许在AudioInputStream
方法开头的Clip
之前,每次尝试获取新的play()
?
意思是尝试在方法的开头添加此行:
audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile());
答案 2 :(得分:0)
试试这个:让你的Clip成为一个实例变量(并且是私有的)。初始化Clip时,将其保持打开状态。
对于播放剪辑的方法,只做以下两件事:(1)将帧位置或微秒位置移回0,(2)调用剪辑的start()方法。
不要重新初始化。不要关闭。不要重新打开。
你看过Clip的规格吗? 关于open()方法:
在已经打开的行上调用此方法是非法的 可能会导致IllegalStateException。
关于close()后跟open()的想法:
请注意,某些线条一旦关闭,就无法重新打开。尝试去 重新打开这样的行将始终导致LineUnavailableException。
如果您确定不再调用剪辑,那就是关闭()剪辑的时间。
Java教程可能更清晰,但这里也是他们的链接: http://docs.oracle.com/javase/tutorial/sound/playing.html
很多人只能“有点”阅读(或阅读并不理解)因为很多人感到困惑并尝试初始化并在每次播放时打开剪辑,这实在是效率低下。在将整个数据文件加载到内存之前,甚至不会开始播放,这会增加不必要的延迟。