跨平台声音 API

cross platform sound API

本文关键字:API 声音 跨平台      更新时间:2023-10-16

我正在考虑开发一个需要实时音频流的应用程序。我更喜欢使用一些用 C 或 C++ 编写的跨平台(windows/linux/BSD)开源库,即使使用各自操作系统的声音 API 编写它仍然是一种选择。

我读过一些关于各种声音库的信息,包括SFML,SDL和PortAudio。诚然,我对 FreeBSD 和 Linux 中的声音研究还不够(这两者之间有多相似?)

主要要求将是

  1. 从选定的麦克风获取音频以通过网络发送,
  2. 将数据发送到选定的输出设备,
  3. 处理声音(过滤、清理噪音、多路复用流等),但这可以在我拥有音频数据后完成,库本身不需要能够做任何事情。
  4. 具有合理的低延迟

我主要担心的是,这些提到的 API 似乎主要针对游戏(其中声音通常从磁盘加载,并且没有太多(如果有的话)涉及录音,而不是通过网络流式传输,录制和播放之间同等重要。

有没有人对这些或其他声音 API 有任何指示/警告/建议,或者关于在各个操作系统的 API 中实现这一点的优缺点?

注意:而这个:"要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是题外话"确实使问题偏离主题,当人们还考虑"因为他们倾向于吸引固执己见的答案和垃圾邮件"时,我认为这个问题不应该被关闭。寻找所描述的这样一个库的人将很难找到任何东西,这个问题的答案实际上总结了所有可用的选项。因此,这是在"一般覆盖...程序员常用的软件工具;" 接受答案的类别。

PortAudio 是您正在描述的应用程序的绝佳选择 - 它在所有这些平台上运行,用 C 编写,提供低延迟,并具有回调和阻塞 I/O 选项。它绝对符合您的要求,并且不是特别针对游戏。事实上,我想说还有其他更适合游戏的 API,而 PortAudio 更适合通用音频 I/O,例如类似 voip 的应用程序、音频播放器、专业音频应用程序、录音、软件收音机等。

您可能会考虑的另一个选择是RTAudio,我不太熟悉。我的理解是它更简单一些(没有阻塞I/O AFAIK),并且支持更多平台,包括移动操作系统,尽管PortAudio人员正在研究这一点。

您关于 FreeBSD 与 Linux 的问题:Linux 使用 ALSA,而其他 unix 使用 OSS。OSS 和 ALSA 都提供兼容层,因此 ALSA 具有 OSS 兼容性,反之亦然,但根据我的经验,两个兼容层都存在错误。不过,自从我上次使用它以来,情况可能变得更好了。

一些Linux桌面在ALSA上运行PulseAudio。我不确定 FreeBSD 是否如此。出于某种原因,ALSA 在大多数系统上默认配置为独占模式。虽然这在理论上很容易解决,但配置文件很奇怪,大多数用户没有这样做,也永远不会这样做,这意味着一旦 PulseAudio 接管,您将无法再直接访问 ALSA 设备,因此您可能还希望拥有 PulseAudio 驱动程序,除非您想让用户更改他们的配置(如果您的应用程序需要非常低的延迟,您可能会这样做)。

我很确定PortAudio支持PulseAudio,不管它在网站上可能会说什么,也可能不会说什么。我会在邮件列表中询问并在此处更新。

更新:邮件列表中的某人认为您可以使用Alsa驱动程序访问PulseAudio。这对我来说是(好!)消息,但它就在那里。

我认为 SDL 和 OpenAL 既常见又广泛支持。 除非这些不能满足您的需求,否则我建议不要进入较低的级别,因为您将失去平台独立性。

它们似乎面向游戏的原因仅仅是因为这是更难的用例之一。因此,如果您可以支持游戏,那么您很可能会支持其他应用程序想要的任何东西(工作室软件除外)。

考虑低延迟的目标。游戏需要非常低的延迟,以确保音效与屏幕上的动作完美匹配。我认为这是您想要这样做的类似原因(因此您的声音与您的视频流相匹配,并且语音通道中没有暂停)。

顺便说一句,你对游戏的看法是不正确的。很多游戏都有用户语音渠道进行团队沟通。此外,它们可能包括程序声音和声音效果。


我找到了另一个称为SFML的,其中包括录音支持。我不太了解它,但我看到它可以取代 SDL。

libsoundio是一个适合您要求的低级C库。

需要注意的是:它还不支持OSS(FreeBSD)或sndio(OpenBSD)。

我强烈建议你在跨平台(Linux/Mac/Windows)Qt框架上开发它,并使用它自己的Qt库。在Qt多媒体模块中,您可以使用QAudioInput从麦克风捕获原始音频。您可以再次使用QtMultimedia进行处理。

Qt框架针对多媒体和游戏应用程序进行了大量优化,因此您不会降低性能。

linphone 包含 mediastreamer2 用于此目的