繁体   English   中英

Windows 中低级音频的最佳 API?

[英]Best API for low-level audio in Windows?

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

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

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

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

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

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

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

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

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

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

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

PortAudio http://www.portaudio.com/

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM