Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在查找Windows DirectSound/WASAPI/的Java包装器?音频_Java_Audio_Java Native Interface_Javasound - Fatal编程技术网

正在查找Windows DirectSound/WASAPI/的Java包装器?音频

正在查找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

在花了相当多的时间尝试围绕现有的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的局限性,那也没问题,但经过一周的努力,我几乎已经放弃了


谢谢。

我想没有这样的图书馆。。。但你想要完成的任务其实并没有那么难:

您需要将应用程序与音频帧同步。。。这意味着音频是计时的主要权威。您可以创建一个新的计时器,该计时器将定期发布用于播放的声音块,并发出正在播放的声音块xy的事件

您需要以与实时相同的速率提供块。。。意思是在一秒钟内发布一秒钟的样本

回放本身可以通过Windows中的WaveOut函数完成(,您可以搜索教程)。您可以使用JNI从Java访问这些函数。WaveOut以Wav格式播放声音,这意味着您可以通过简单的LPC调制和原始采样打开设备


整个过程不会完全同步,但延迟不会太大。请注意waveOutWrite的缓冲区下溢,您需要在最后一个区块完成播放之前提供新区块,否则声音将失真。

我尚未尝试这两种方法,但可能值得研究:

  • Jitsi也做了一些工作


对于这种低延迟音频,唯一能做到这一点的是ASIO,所以你可以使用JAsioHost,但你需要一个带有ASIO驱动程序的声卡,它主要是专业的声音硬件。@JakubZaverka是的,我在看ASIO。我还找到了ASIO4ALL驱动程序(即使在我的小型测试笔记本电脑上也可以使用),但这仍然使安装更加复杂。我还看到新司机有一些奇怪的行为。我更喜欢简单的帧位置可预测性/可观察性,而不需要这种复杂性。我真的不需要低延迟(我需要能够测量一致的延迟来处理它),但需要能够将我的应用程序与正在播放的音频同步。