我编写了一段代码来读取 WAV 文件(大小约为 80 mb)并播放该文件。问题是声音播放效果很差(极度滞后)。你能告诉我有什么问题吗?
这是我的代码:
(我称之为doPlay
Jframe 构造函数内的函数)
private void doPlay(final String path) {
try {
stopPlay();
InputStream is = new FileInputStream(path);
InputStream bufferedIn = new BufferedInputStream(is);
AudioInputStream ais = AudioSystem.getAudioInputStream(bufferedIn);
AudioFormat format = ais.getFormat();
// this is the value of format.
// PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
DataLine.Info info = new DataLine.Info(Clip.class, format);
clip = (Clip)AudioSystem.getLine(info);
clip.open(ais);
clip.start();
} catch (Exception e) {
stopPlay();
e.printStackTrace();
}
}
问题是你需要加载剪辑prior来玩它。剪辑在播放之前会完全加载到内存中。
换句话说,clip.open() 之前的所有事情都应该在播放剪辑之前发生。当您准备好播放剪辑时,您应该使用的唯一命令是clip.start()。要重播剪辑,请将其光标位置设置回开头并调用clip.start()。
如果剪辑足够短,您就可以摆脱在播放它们的同时打开它们(加载它们)的低效编码实践。如果您确实想从文件而不是内存中播放,请使用 SourceDataLine,对于较大的文件,它的启动速度将比 Clip 快得多。
剪辑:必须加载到内存中才能播放,加载后,它会使用最少的CPU 来播放。专为小型且可重复使用的声音文件而设计。
SourceDataLine:从文件位置播放,立即开始,消耗很少的内存(比 Clip 少得多),但由于文件读取而使用比 Clip 稍多的 cpu。最适合较大的单播放音频。
LAG 的另一个来源:第一次调用声音文件时,由于从编译的代码执行,它的运行速度会稍微慢一些。通过重用,声音代码会被放入内存中并以最小的延迟执行。因此,有时我会在程序开始时播放“无声”声音来“启动泵”,这样当需要听到的第一个声音播放时,它会以较少的延迟播放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)