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