Windows中低级音频的最佳API?

时间:2010-01-06 01:26:05

标签: c windows audio audio-streaming

我正在研究用C语言编写的音频应用程序。我需要在Windows下提供实时音频播放。我需要决定使用哪个音频API。我打算使用the basic waveOut API,但我想查看社区推荐的内容。

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

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

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

为了我的目的,有没有比waveOut更好的东西,或者那是最好的选择?

4 个答案:

答案 0 :(得分:16)

这取决于你想要做什么。基本的waveOut音频API更适合流式传输音频。它允许您排队几个缓冲区并让它们连续自动播放。但是,如果正在播放音频并且您想要更改它,或者添加一些内容,则相对较难。

DirectX音频更适合基于事件的音频。你可以同时玩几件事情,而不必亲自动手。您可以轻松添加或删除少量音频 - 例如当用户拉动枪上的触发器时播放声音。但是流媒体(即一个接一个地播放1个缓冲区)更难。

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

ASIO在编程难度方面就像waveOut和DirectX一样糟糕。它不是那么稳定。应用程序通常无法共享音频设备。但它为您提供了对该音频硬件的最低延迟访问。

ASIO还为您提供了一种在多个设备上同步播放的方法。

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

答案 1 :(得分:5)

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

PortAudio http://www.portaudio.com/

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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