Windows 中低级音频的最佳 API?

Posted

技术标签:

【中文标题】Windows 中低级音频的最佳 API?【英文标题】:Best API for low-level audio in Windows? 【发布时间】:2011-01-01 21:30:48 【问题描述】:

我正在开发一个用 C 编写的音频应用程序。我需要在 Windows 下提供实时音频播放。我需要决定使用哪个音频 API。我打算使用the basic waveOut API,但我想看看这里的社区推荐什么。

我想要的代码可以在任何最新版本的 Windows 上运行,无需安装库;我想要最小的延迟。

我不需要也不想要任何“效果”,我只需要忠实地播放应用程序生成的任何波形样本。

我的理解是 Windows 上的大多数专业音频应用程序都使用 ASIO,它提供了出色的低延迟,但我不想要 ASIO,因为我希望我的代码能够正常工作,而大多数人没有预装 ASIO在他们的电脑上。 (稍后我可能会返回并添加 ASIO 作为选项,但我会先选择最通用的解决方案。)

就我的目的而言,有什么比 waveOut 更好,还是最好的选择?

【问题讨论】:

【参考方案1】:

这取决于你想要做什么。基本的 waveOut 音频 API 更适合流式传输音频。它使您可以将多个缓冲区排队并让它们连续自动播放。但是,如果正在播放音频,并且您想对其进行更改或添加一些内容,那就比较困难了。

DirectX 音频更适合基于事件的音频。您可以同时播放几件东西,而无需自己进行混音。您可以轻松添加或删除小段音频 - 例如当用户扣动枪上的扳机时播放声音。但是流式传输(即一个接一个地播放 1 个缓冲区)更难。

waveOut 旨在促进播放恒定的音频,例如 .mp3 文件。 DirectX 专为间歇性音频而设计,例如游戏中的反馈。

ASIO 就编程难度而言就像waveOut 和DirectX 中最差的,而且不是那么稳定。应用程序通常不能共享音频设备。但是,它为您提供了对该音频硬件的最低延迟访问。 ASIO 还为您提供了一种在多个设备上同步播放的方法。

如果您不需要能够在播放之前更改即将播放的内容,并且不需要同步多个设备,那么您不需要ASIO。

【讨论】:

XAudio2 旨在替代 DirectSound。它是在 WinXP 上的 DirectSound 之上实现的。对于 WinVista 及更高版本,它已集成到内核音频中。如果您打算使用 DirectSound 而不是 waveout,这可能是比使用 DirectSound 更好的选择。 @JohnKnoeller 很抱歉破坏了这个。您能否详细说明“(XAudio2)在 WinXP 上的 DirectSound 之上实现。对于 WinVista 及更高版本,它已集成到内核音频中。”?我来自this question 他在谈论this(另一张图here)。我还不会真正将 WASAPI 描述为“内核音频”,但无论如何您只能将 XAudio2 视为 Vista+ 上的第一层 api。【参考方案2】:

在我提出这个问题时,我使用 waveOut 和 waveIn API 编写了流式代码。从那以后,我发现了一个有用的库:

PortAudio http://www.portaudio.com/

PortAudio 是具有商业友好许可证的免费软件。如果您编写代码来调用 PortAudio,它应该能够与 waveOut 设备一起使用,也可以与 Windows 下的 ASIO 设备一起使用;然后可以为 Linux 重新编译它,并且应该可以与 ALSA 设备一起使用;然后可以为 Mac 重新编译它,并且应该可以与 CoreAudio 设备一起使用。我还没有测试过 Mac 部分,但我的项目在 Windows 和 Linux 上运行良好。

【讨论】:

【参考方案3】:

除了 John Knoeller 提到的选项之外,还有 WASAPI 允许比 WaveOut 低得多的延迟,但遗憾的是仅从 Windows Vista 开始可用。

【讨论】:

【参考方案4】:

我自己编写了一个 DirectSound 流应用程序,我当然推荐它,因为它具有低延迟和易用性。此外,它还使您能够设置更高质量的格式以在旧版 Windows 上播放。

【讨论】:

以上是关于Windows 中低级音频的最佳 API?的主要内容,如果未能解决你的问题,请参考以下文章

使用 FMOD 低级 API 中的共振音频时空间化中断

Linux下C/C++的最佳音频播放api?

为 OS X 和 Windows 创建既是音频单元又是 VST 的音频插件 UI 的“最佳”方法是啥?

使用反应时访问“本地”文件以在 Web 音频 API 中使用的最佳方式?

读取 AudioFileInitializeWithCallbacks 所需的回调?苹果音频文件 API

获取音频混合器中可视化的单个 Windows 应用程序当前音量输出级别