19

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

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

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

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

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

4

4 回答 4

19

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

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

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

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

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

于 2010-01-06T01:37:15.413 回答
5

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

PortAudio http://www.portaudio.com/

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

于 2011-04-28T19:55:46.370 回答
4

除了 John Knoeller 提到的选项之外,还有WASAPI,它允许比 WaveOut 低得多的延迟,但不幸的是,它只能从 Windows Vista 开始使用。

于 2010-01-06T09:40:09.123 回答
2

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

于 2010-01-06T10:06:27.343 回答