我想在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)进行简历?
答案 0 :(得分:4)
预期的方法是在SourceDataLine上调用stop()
暂停它,然后start()
恢复它。如果在启动时停止向SourceDataLine提供音频数据,则会导致缓冲区欠载,这通常被视为错误情况。仅在数据处于停止状态时停止输入数据。
drain()
。不要将其称为“暂停”功能!
为了更好地控制,您应该将小缓冲区写入源数据线是正确的。一个好的大小相当于50ms缓冲区 - 使用open(AudioFormat, bufferSize)
方法指定缓冲区大小(以字节为单位)(例如4420Hz,16位立体声为8820字节)。
另外我会说使用Clip是首选解决方案。在Clip上使用start()和stop(),它不应该吞下太多。大多数Java Sound实现在内部为Clip使用SourceDataLine,因此应该没有功能差异。 Java Sound应确保您可以一次播放多个Clip。