【问题标题】:real time audio processing in C++C++中的实时音频处理
【发布时间】:2015-12-09 01:35:51
【问题描述】:

我想制作一种软件,它可以从外部音频接口 (Focusrite Scarlett 2i2) 读取原始音频并在 C++ 中对其进行处理,然后再将其返回到接口进行播放。我目前运行的是 Windows 8,想知道如何以最小的延迟做到这一点?

我花了一段时间研究(增强)ASIO,但文档似乎相当糟糕。我也一直在考虑 OpenCL,但有人告诉我它很可能会有更高的延迟。理想情况下,我希望能够直接访问 Focusrite 驱动程序。

很抱歉,这是一个悬而未决的问题,但我在寻找有关音频编程的教育资料时遇到了一些麻烦,除了在由第三方插件设计套件(如 RackAFX)提供时操纵音频之外。如果有人能推荐一些有关此类低级内容的读物,我也将不胜感激。

【问题讨论】:

  • 我也意识到我不太可能将最终产品的延迟降低到不明显的低水平,我只是想看看我能做到多近。
  • 您还没有说您使用的是哪个平台。在 MacOSX 上,Firewire/Thunderbolt 设备的缓冲区延迟可以降低到 1 毫秒以下。对于 USB 来说,它会比这多一点。可以实现 5-10 毫秒的往返延迟,但这是以 CPU 利用率高为代价的。

标签: c++ audio latency


【解决方案1】:

您可以通过直接与 Focuswrite ASIO 驱动程序通信来获得非常低的延迟(这与 boost ASIO 完全不同)。要使用此功能,您需要从 Steinberg 注册并下载 ASIO SDK。在 API 下载中有一个名为 hostsample 的 Visual C++ 示例项目,这是一个很好的起点,并且有关于 ASIO 使用的缓冲过程的非常好的文档。

ASIO 使用双缓冲。您的应用程序能够在驱动程序的限制范围内选择缓冲区大小。对于每个输入通道和每个输出通道,都会创建 2 个该大小的缓冲区。当驱动程序从一组缓冲区播放和记录时,您的程序正在从另一组缓冲区读取和写入。如果您的程序正在执行简单的环回,那么它可以在记录后访问输入 1 缓冲期,直接写入将在下一个周期播放的输出缓冲区,因此会有 2 个缓冲期的延迟。您需要尝试找到可以容忍的最小缓冲区大小而不会出现故障,这将为您提供最低的延迟。当然,信号处理代码需要优化得足够好才能跟上。 64 个样本(1.3 ms @ 48kHz)并非闻所未闻。

【讨论】:

  • MAC 等效为 Core 音频驱动程序
  • @UmNyobe:排序:要在 MacOSX 上实现低延迟,只需使用 CoreAudio 和 AudioUnits 的普通高级 API 您也可以在 MacOSX 上使用 ASIO - 它简单地位于 CoreAudio 之上,而不是使用它自己的一组驱动程序 - 它传统上在 Windows 上完成以避免系统音频堆栈。您想要这样做的原因是提供了跨平台抽象。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2018-01-17
  • 2015-07-18
  • 2017-08-02
  • 1970-01-01
  • 2013-06-23
相关资源
最近更新 更多