我使用以下代码加载剪辑(javax.sound.sampled.Clip)
def createClip(file:String):Clip = {
val clip = AudioSystem.getClip()
clip.open(AudioSystem.getAudioInputStream(new File(s"sounds/$file.wav")))
clip
}
它是用Scala编写的,但我想任何不熟悉scala的人都会看到它与java基本相同,就像java一样。
我的尝试是让它毫不费力地播放这样的声音
createClip("example_WAV_File").start()
由于我将创建一个新剪辑,每次调用一个声音文件时,我都认为重卷剪辑不应该有任何问题。 然而,在实际的应用程序(游戏)中,我使用这个库来处理Punch和所有这些东西产生的声音。现在是这样的事情,当(例如)冲压几次,有些时候我会得到
线程“Thread-58”中的异常javax.sound.sampled.LineUnavailableException:行格式为PCM_SIGNED 44100.0 Hz,16位,立体声,4字节/帧,不支持little-endian。
我曾遇到类似的错误,但这是关于比特编码超过16位。由于我的文件有16位编码,我不知道这可能是什么......
如上所述,播放多个剪辑时会出现错误 。 我想,这可能表明存在内存问题。我天真地想,垃圾收集器会为我做所有工作,因为剪辑在离开其范围时会失去任何参考。
我最初的解决方案是,保持对我要播放的任何声音的引用,并且只在另一个实例需要已经播放的声音时才回放它。这个解决方案永远不会破坏,但它真的不能两次播放相同的剪辑。这就是为什么我在需要时切换到多次加载剪辑的原因。
我想,我可能应该在剪辑上使用close()方法。
val clip = createClip("example_WAV_file")
clip.start()
clip.close()
这实际上解决了我的问题,增强了我的猜测,它可能与内存有关,但是,现在剪辑会在启动后立即停止。
我是否真的需要为每个剪辑创建一个线程,等待 clip.getMicrosecondLength()时间关闭它?这听起来很糟糕。
仅剩下选项 - >我正在使用声音API真的非常错误,即使我想,我正在使用它只是一些教程给我看的方式。那我的特殊错误在哪里?或者,能够同时播放相同剪辑两次的解决方案是什么?