visual-c++ - 同步两个声卡

标签 visual-c++ audio circular-buffer

我有一个用 C++ 编写的程序,它使用 RtAudio ( Directsound ) 以 48kHz 采样率捕获和播放音频。

输入捕获使用回调选项。回调将数据写入环形缓冲区。
输出是从环形缓冲区读取的单独线程中的阻塞写入函数。

如果输入和输出设备相同,则音频循环完美。
现在我想从设备 1 获取音频并在设备 2 上播放。每个设备都有自己的采样时钟设置为 48kHz,但不同步。几秒钟后,输入和输出不同步。

是否可以同步两个独立的音频设备?

最佳答案

您面临两个挑战:

  • 让两个设备同时启动。
  • 让两个设备保持同步。

  • 这两项任务都很困难。在专业音频领域,#2 是通过特殊硬件实现的,以同步多个设备的字时钟。也可以通过 high quality video signal 来完成.我相信它也可以用火线设备完成,但我不确定它是如何工作的。在实践中,我使用了没有同步(“狂野”)的设备,并且在长达一两个小时内获得了非常合理的同步。根据您尝试执行的操作,同步在几分钟内的漂移不应超过几毫秒。如果是这样,你可以认为你的硬件坏了(当然,便宜的硬件经常坏)。

    至于#1,我不确定这在任何可靠的意义上是可能的。就任何音频 API 而言,它是最困难的:两张卡都有需要一些时间来设置、打开和开始播放的流。一般来说,解决方案是使用这个时间超低的API(例如ASIO)。这适用于视频等应用程序,但我不知道它是否真的解决了一般问题。

    如果你真的需要解决这个问题,你可以打开两张卡,开始播放静音,并使用卡生成的时间信息来确定将数据放入卡和最终播放之间的延迟(这对于每个卡,可能每次运行时)并使用该数据来计算何时开始实际播放。我不知道 RTAudio 是否提供必要的计时信息,但 PortAudio 提供。 This document可能会有所帮助。

    关于visual-c++ - 同步两个声卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649155/

    相关文章:

    c++ - 从 DLL 导出类

    visual-c++ - "getenv... function ... may be unsafe"- 真的吗?

    c++ - 如何修复错误 "Variable-sized object may not be initialized "?

    c++ - 高精度事件定时器

    iphone - 如何释放或释放分配给.wav文件的内存?

    ios - 无需菜单 ios 即可自动分享到 whatsapp

    python - 如何使用pygame播放音乐(Python)

    c++ - 多线程使用者使用boost ringbuffer不产生与输入相同的输出

    C 中使用指针的循环缓冲区

    c - "Magic ring buffer"在Linux内核空间的实现?