Java 剪辑不再播放声音

Java 剪辑不再播放声音,java,audio,javasound,Java,Audio,Javasound,我有一种播放声音的方法。第一次起作用,但第二次我听不到声音。 首先,我在构造函数中实例化AudioInputStream: private AudioInputStream audio; public AudioTest() { try { audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile()); } catch (UnsupportedAudio

我有一种播放声音的方法。第一次起作用,但第二次我听不到声音。 首先,我在构造函数中实例化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) {
        }
}

我第一次听到音频,但不是第二次。为什么?

首先尝试关闭
剪辑:

clip.close();

在您的
play()
方法开始时,在获取
Clip
之前,可以尝试每次获取一个新的
AudioInputStream

意思是尝试在方法的开头添加此行:


audio=AudioSystem.getAudioInputStream(新文件(路径).getAbsoluteFile())

尝试以下操作:将剪辑作为实例变量(并且是私有的)。初始化剪辑时,请将其保持在打开状态

对于播放剪辑的方法,只需执行以下两项操作:(1)将帧位置或微秒位置移回0,(2)调用剪辑的start()方法

不要重新初始化。不要关门。不要重新打开

你看过夹子上的规格了吗? 关于open()方法:

在已打开的行上调用此方法是非法的,并且 可能导致非法状态例外

关于close()后跟open()的概念:

请注意,某些行一旦关闭,就无法重新打开。试图 重新打开此行将始终导致LineUnavailableException

当您确定不再调用该剪辑时,就是关闭()该剪辑的时候了

Java教程可能更清晰,但这里还有它们的链接:


很多人只能“有点”读这篇文章(或者读了却不明白),因为很多人会感到困惑,试图在每次播放时初始化并打开一个剪辑,这是非常低效的。直到整个数据文件加载到内存中,播放才会开始,这会增加不必要的延迟。

在打开方法之前,对吗?很抱歉,它不起作用,而且我第一次没有听到。为了更快地获得更好的帮助,请发布一个(最小完整且可验证的示例)。剪辑的全部要点是不必每次都加载声音。“这是为了让你可以从记忆中播放它。”Philfreihoff我实现了一个程序,可以编旋律并播放它们。这些音符是用剪辑播放的。我重复使用了相同的剪辑,每次都重新设置了它们(就像它们的本意一样),结果听起来不一致,而且非常糟糕。有人建议我不要重复使用相同的剪辑,而是每次都换新的,现在它工作得很好(是的,这很奇怪)。所以值得一试。好奇。短文件作为剪辑加载的速度要比长笔记快得多,所以可能还有其他因素。如果每次都要加载新数据,最好使用SourceDataLine而不是Clip。我必须看更多的节目才能理解你的结果。当涉及到实时声音保证时,Java可能非常难以控制,特别是当跨越多个线程时。而微软操作系统(系统时钟只精确到15毫秒左右)的情况更糟。例如,通过点击按钮或鼠标移动跨线程触发声音,很难处理好。是的,我想剪辑不是为了播放音乐等“性能关键”的东西,因此,出于某种原因,实例化新剪辑实际上比重用当前剪辑的功能要快。谁知道呢