Java 剪辑不再播放声音
我有一种播放声音的方法。第一次起作用,但第二次我听不到声音。 首先,我在构造函数中实例化AudioInputStream:Java 剪辑不再播放声音,java,audio,javasound,Java,Audio,Javasound,我有一种播放声音的方法。第一次起作用,但第二次我听不到声音。 首先,我在构造函数中实例化AudioInputStream: private AudioInputStream audio; public AudioTest() { try { audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile()); } catch (UnsupportedAudio
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) {
}
}
我第一次听到音频,但不是第二次。为什么?首先尝试关闭
剪辑:
clip.close();
在您的play()
方法开始时,在获取Clip
之前,可以尝试每次获取一个新的AudioInputStream
意思是尝试在方法的开头添加此行:
audio=AudioSystem.getAudioInputStream(新文件(路径).getAbsoluteFile())代码>尝试以下操作:将剪辑作为实例变量(并且是私有的)。初始化剪辑时,请将其保持在打开状态
对于播放剪辑的方法,只需执行以下两项操作:(1)将帧位置或微秒位置移回0,(2)调用剪辑的start()方法
不要重新初始化。不要关门。不要重新打开
你看过夹子上的规格了吗?
关于open()方法:
在已打开的行上调用此方法是非法的,并且
可能导致非法状态例外
关于close()后跟open()的概念:
请注意,某些行一旦关闭,就无法重新打开。试图
重新打开此行将始终导致LineUnavailableException
当您确定不再调用该剪辑时,就是关闭()该剪辑的时候了
Java教程可能更清晰,但这里还有它们的链接:
很多人只能“有点”读这篇文章(或者读了却不明白),因为很多人会感到困惑,试图在每次播放时初始化并打开一个剪辑,这是非常低效的。直到整个数据文件加载到内存中,播放才会开始,这会增加不必要的延迟。在打开方法之前,对吗?很抱歉,它不起作用,而且我第一次没有听到。为了更快地获得更好的帮助,请发布一个(最小完整且可验证的示例)。剪辑的全部要点是不必每次都加载声音。“这是为了让你可以从记忆中播放它。”Philfreihoff我实现了一个程序,可以编旋律并播放它们。这些音符是用剪辑播放的。我重复使用了相同的剪辑,每次都重新设置了它们(就像它们的本意一样),结果听起来不一致,而且非常糟糕。有人建议我不要重复使用相同的剪辑,而是每次都换新的,现在它工作得很好(是的,这很奇怪)。所以值得一试。好奇。短文件作为剪辑加载的速度要比长笔记快得多,所以可能还有其他因素。如果每次都要加载新数据,最好使用SourceDataLine而不是Clip。我必须看更多的节目才能理解你的结果。当涉及到实时声音保证时,Java可能非常难以控制,特别是当跨越多个线程时。而微软操作系统(系统时钟只精确到15毫秒左右)的情况更糟。例如,通过点击按钮或鼠标移动跨线程触发声音,很难处理好。是的,我想剪辑不是为了播放音乐等“性能关键”的东西,因此,出于某种原因,实例化新剪辑实际上比重用当前剪辑的功能要快。谁知道呢