2009-10-11 186 views
2

我想在Java中播放WAV声音(一些自定义视频格式的音频曲目),但是,我无法使用Clip:一次似乎只有一个实例是可忍受的。因此,我切换到普通的旧的SourceDataLine方式。暂停SourceDataLine播放

在这种情况下,我想在视频暂停和取消暂停时暂停和恢复音频。不幸。当我请SDL停止()时,播放螺纹完全完成和声音缓冲器被清空:

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

发出异步停止(),同时音频线程被阻塞上写(),或漏()将实际上放松播放位置。

我该如何用阻塞的方式暂停SourceDataLine,以及/或者如何知道已经通过它播放了多少音频来使用write(databuffer,skip,len)执行恢复操作?

回答

4

预期的方法是在SourceDataLine上调用stop()来暂停它,start()以恢复它。如果停止在音频数据启动时向SourceDataLine提供音频数据,则会导致缓冲区溢出,这通常被认为是错误状况。只有在数据处于停止状态时才停止送入数据。

drain()最后应调用以确保所有数据都已经写入到SourceDataLine中。不要称它为“暂停”功能!

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

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