我想在 Java 中播放 WAV 声音(某些自定义视频格式的音轨),但是,我在使用 Clip 时遇到了麻烦:似乎一次只能听到一个实例。因此,我切换到普通的旧 SourceDataLine 方式。
在这种情况下,我想在视频暂停和取消暂停时暂停和恢复音频。很遗憾。当我在 SDL 上调用 stop() 时,播放线程完全完成并且声音缓冲区被清空:
sdl.open();
sdl.start();
sdl.write(dataBuffer);
sdl.drain();
sdl.stop();
Run Code Online (Sandbox Code Playgroud)
当音频线程在 write() 或排出() 上阻塞时发出异步 stop() 实际上会丢失播放位置。
如何以阻塞方式暂停 SourceDataLine,和/或如何知道已通过它播放了多少音频以使用 write(databuffer,skip,len) 进行恢复?
预期的方法是调用stop()SourceDataLine 来暂停并start()恢复它。如果在启动时停止向 SourceDataLine 提供音频数据,则会导致缓冲区欠载,这通常被视为错误情况。仅当处于停止状态时才停止馈送数据。
drain()当想要确保已写入 SourceDataLine 的所有数据均已播放时,应在最后调用。不要称其为“暂停”功能!
为了更好的控制,您应该将小缓冲区写入源数据线,这是正确的。一个好的大小相当于 50ms 的缓冲区——使用该open(AudioFormat, bufferSize)方法以字节为单位指定缓冲区大小(例如,44100Hz、16 位立体声为 8820 字节)。
我还想说,使用 Clip 是首选解决方案。在 Clip 上使用 start() 和 stop() ,它不应该吞咽太多。大多数 Java Sound 实现在内部使用 SourceDataLine 作为 Clip,因此应该没有功能差异。Java Sound 应该确保您可以同时播放多个剪辑。
| 归档时间: |
|
| 查看次数: |
3397 次 |
| 最近记录: |