暂停SourceDataLine播放

时间:2009-10-11 10:46:35

标签: java audio

我想在Java中播放WAV声音(一些自定义视频格式的音轨),但是,我在使用Clip时遇到了麻烦:似乎一次只有一个实例是可以听到的。因此,我切换到原始的SourceDataLine方式。

在这种情况下,我希望在视频暂停和取消暂停时暂停和恢复音频。不幸。当我在SDL上调用stop()时,播放线程完全结束,声音缓冲区被清空:

sdl.open();
sdl.start();
sdl.write(dataBuffer);
sdl.drain();
sdl.stop();

当音频线程在write()或drain()上阻塞时发出异步stop()实际上会松开播放位置。

如何以阻塞方式暂停SourceDataLine,和/或如何知道通过它播放了多少音频来使用write(databuffer,skip,len)进行简历?

1 个答案:

答案 0 :(得分:4)

预期的方法是在SourceDataLine上调用stop()暂停它,然后start()恢复它。如果在启动时停止向SourceDataLine提供音频数据,则会导致缓冲区欠载,这通常被视为错误情况。仅在数据处于停止状态时停止输入数据。

当想要确保所有数据都已写入您已写入SourceDataLine的数据时,应在结束时调用

drain()。不要将其称为“暂停”功能!

为了更好地控制,您应该将小缓冲区写入源数据线是正确的。一个好的大小相当于50ms缓冲区 - 使用open(AudioFormat, bufferSize)方法指定缓冲区大小(以字节为单位)(例如4420Hz,16位立体声为8820字节)。

另外我会说使用Clip是首选解决方案。在Clip上使用start()和stop(),它不应该吞下太多。大多数Java Sound实现在内部为Clip使用SourceDataLine,因此应该没有功能差异。 Java Sound应确保您可以一次播放多个Clip。