花了相当多的时间试图围绕现有的javax.sound.sampled库来设计我的方式以获得简单(但相对时间准确)的音频捕获/渲染,我得出结论我真的需要去原生音频API。我发现的问题是我需要能够以20或50毫秒的增量获得声音的帧位置(我通过写入SourceDataLine进行渲染),精确到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(似乎是Creative支持音频硬件加速的“开放”方式,因为现在不再支持Vista - 面向游戏,而且比我需要的更多),JSyn(专注于综合,MIDI,不是简单的采样)接口)和JAsioHost(迄今为止最有希望)。
如果有一些方法可以解决我在JavaSound API中所提到的限制,那也没关系,但我只是在经过一周的努力后放弃了。
感谢。
答案 0 :(得分:0)
我想没有这样的库......但你要完成的任务实际上并不那么难:
您需要将应用与音频帧同步...这意味着音频是时间的主要权威。您可以创建一个新的计时器,它将定期发布声音块以进行播放,并发出正在播放的块xy的事件。
您需要以与实时相同的速率提供块...意味着在一秒钟内发布一秒钟的样本。
播放本身可以通过Windows中的WaveOut功能完成(link here,您可以搜索教程)。您可以使用JNI从Java访问这些函数。 WaveOut以Wav格式播放声音,这意味着您可以使用简单的LPC调制打开设备并发布原始样本。
整个事情不会完全同步,但延迟不会很大。注意waveOutWrite的缓冲区下溢,你需要在最后一个块完成播放之前提供新的块,否则声音会失真。
答案 1 :(得分:0)
我还没有尝试过其中任何一种,但可能值得研究:
Jitsi已经为wrap WASAPI做了一些工作。