我有一个用C ++编写的程序,它使用RtAudio(Directsound)以48kHz采样率捕获和播放音频。
输入捕获使用回调选项。回调将数据写入环形缓冲区。 输出是在从ringbuffer读取的单独线程中的阻塞写入函数。
如果输入和输出设备相同,则音频循环完美无缺。 现在我想从设备1获取音频并在设备2上播放。每个设备都有自己的采样时钟设置为48kHz但不同步。几秒钟后,输入和输出不同步。
是否可以同步两个独立的oudio设备?
答案 0 :(得分:0)
您面临两个挑战:
这两项任务都很困难。在专业音频领域,#2是通过特殊硬件实现的,以同步多个设备的字时钟。它也可以使用high quality video signal来完成。我相信它也可以用火线设备完成,但我不确定它是如何工作的。在实践中,我使用了没有同步(“狂野”)的设备,并且在一两个小时内获得了非常合理的同步。根据您的尝试,同步不应该在几分钟内漂移超过几毫秒。如果是这样,你可以认为你的硬件坏了(当然,廉价的硬件经常坏掉)。
至于#1,我不确定这对于directsound是否可行。在某种程度上,任何音频API都可以实现,但最多也很难:两张卡都有需要一些时间来设置,打开和开始播放的流。通常,解决方案是使用此时超低的API(例如,ASIO)。这对于像视频这样的应用来说效果相当不错,但我不知道它是否真的能解决这个问题。
如果你真的需要解决这个问题,你可以打开两张卡片,开始播放静音,并使用卡片生成的定时信息来确定将数据放入卡片及其最终播放之间的延迟(这将是不同的每张卡,可能每次你运行)并使用该数据来计算何时开始实际播放。我不知道RTAudio是否提供了必要的时序信息,但PortAudio确实如此。 This document可能有帮助。