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