正在查找Windows DirectSound/WASAPI/的Java包装器?音频
在花了相当多的时间尝试围绕现有的javax.sound.sampled库设计简单(但时间相对准确)的音频捕获/呈现后,我得出结论,我真的需要使用本机音频API。我发现的问题是,我需要能够以20或50毫秒的增量获得声音的帧位置(我通过写入源数据线渲染),精确到1或2毫秒。换句话说,我想将一些图形事件与正在播放的音频同步,视频帧速率为20到50 fps,抖动不超过1或2毫秒。对于这一点,JavaSound实现似乎离硬件太远了(平台独立性的代价是什么?)。在对SDL/TDL缓冲区大小、音频格式、SDL.write()和TDL.read()缓冲区的大小、写入频率等进行了大量“修补”之后,我无法找到一种方法来避免报告的帧位置相对于系统时钟的变化(分辨率为1毫秒,而不是微秒) [进一步澄清:我可以根据系统时钟以固定速率运行图形渲染,这足以满足我的需要。但是,如果要与音轨同步,则在典型音轨之前(例如,5分钟长)接近尾声时,即使是很小的时间差也会累积成音频和图形之间明显的时间差。我本以为只需每秒检查一次同步(或2或5),但报告的音频帧位置的“抖动”会导致随后明显的校正。] 我一直在研究哪些库可能已经可用。似乎许多现有的软件包都是为了支持游戏开发社区。然而,我不需要3D音频、效果硬件加速、合成和处理——只需要一种读取声音帧位置的方法,并且具有一致的延迟。如果延迟高达100毫秒,但保持一致,我可以围绕这一点进行设计 我希望您能推荐提供这种功能的Java库。我认为这将是本机音频API的JNI包装。我现在只需要支持Windows7。我见过OpenAL(似乎是创造性的支持音频硬件加速的“开放”方式,因为现在Vista中不再支持这种方式——面向游戏,这超出了我的需要)、JSyn(专注于合成、MIDI,而不是简单的采样接口)和JAsioHost(到目前为止最有前途) 如果有办法克服我提到的JavaSound API的局限性,那也没问题,但经过一周的努力,我几乎已经放弃了正在查找Windows DirectSound/WASAPI/的Java包装器?音频,java,audio,java-native-interface,javasound,Java,Audio,Java Native Interface,Javasound,在花了相当多的时间尝试围绕现有的javax.sound.sampled库设计简单(但时间相对准确)的音频捕获/呈现后,我得出结论,我真的需要使用本机音频API。我发现的问题是,我需要能够以20或50毫秒的增量获得声音的帧位置(我通过写入源数据线渲染),精确到1或2毫秒。换句话说,我想将一些图形事件与正在播放的音频同步,视频帧速率为20到50 fps,抖动不超过1或2毫秒。对于这一点,JavaSound实现似乎离硬件太远了(平台独立性的代价是什么?)。在对SDL/TDL缓冲区大小、音频格式、SDL
谢谢。我想没有这样的图书馆。。。但你想要完成的任务其实并没有那么难: 您需要将应用程序与音频帧同步。。。这意味着音频是计时的主要权威。您可以创建一个新的计时器,该计时器将定期发布用于播放的声音块,并发出正在播放的声音块xy的事件 您需要以与实时相同的速率提供块。。。意思是在一秒钟内发布一秒钟的样本 回放本身可以通过Windows中的WaveOut函数完成(,您可以搜索教程)。您可以使用JNI从Java访问这些函数。WaveOut以Wav格式播放声音,这意味着您可以通过简单的LPC调制和原始采样打开设备
整个过程不会完全同步,但延迟不会太大。请注意waveOutWrite的缓冲区下溢,您需要在最后一个区块完成播放之前提供新区块,否则声音将失真。我尚未尝试这两种方法,但可能值得研究:
- Jitsi也做了一些工作