在Windows中,最适合低级音频的API是什么?

21

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

我希望代码可以在任何最近版本的Windows上正常工作,无需安装库,并且具有最小延迟。

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

我了解到,大多数Windows上的专业音频应用程序使用ASIO,这可以提供出色的低延迟,但我不想使用ASIO,因为我希望我的代码可以直接运行,而大多数人的计算机上没有预安装ASIO。(在以后的日期,我可能还会回来添加ASIO作为选项,但我首先要选择最通用的解决方案。)

是否存在比waveOut更适合我的目的的其他解决方案,或者waveOut是最好的选择?

4个回答

20

这取决于你想做什么。基本的waveOut音频API更适合流式音频。它允许你排队多个缓冲区并自动按顺序播放它们。但是,如果正在播放音频并且想要更改它或向其中添加内容,则比较困难。

DirectX音频更适合基于事件的音频。您可以同时播放多个内容而无需自己进行混音。您可以轻松添加或删除小段音频-例如在用户扣动枪机时播放声音。但是流式传输(即播放一个缓冲区之后再播放另一个)更加困难。

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

ASIO在编程难度和稳定性方面类似于waveOut和DirectX的最糟情况。应用程序通常无法共享音频设备。但是,它为您提供了对该音频硬件的最低延迟访问。ASIO还提供了一种在多个设备上同步播放的方法。

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


1
XAudio2旨在取代DirectSound。它在WinXP上是基于DirectSound实现的。对于WinVista及更高版本,它已集成到内核音频中。如果您计划使用DirectSound而不是waveout,则使用XAudio2可能是更好的选择。 - John Knoeller
1
@JohnKnoeller 对于打扰您的问题表示抱歉。您能否详细说明 "(XAudio2) is implemented on top of DirectSound on WinXP. For WinVista and later, it's integrated into the kernel audio." 的含义?我是从 这个问题 过来的。 - Panda Pajama
他正在谈论这个(另一个图表在这里)。我不会把WASAPI描述为“内核音频”,但无论如何,你只能将XAudio2视为Vista+上的一级API。 - mirh

5
除了John Knoeller提到的选项之外,还有WASAPI可用,它比WaveOut具有更低的延迟,但不幸的是只能在Windows Vista及以上版本中使用。

5

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

PortAudio http://www.portaudio.com/

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


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接