跨平台声音API

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

我已经阅读了一些关于各种声音库的内容,包括SFML,SDL和PortAudio。 不可否认,我还没有对FreeBSD和Linux中的Sound进行过充分的研究(这两者之间有多相似?)

主要要求是

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

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

有没有人对这些或其他声音API有任何指示/警告/建议,或者有关长远路径并在相应操作系统的API中实现这一点的优点/缺点?

注意:虽然这个:“要求我们推荐或找到书籍,工具,软件库,教程或其他场外资源的问题都是Stack Overflow的偏离主题”当一个人也认为“as他们倾向于吸引固执己见的答案和垃圾邮件“然后我不认为这个问题应该被关闭。 如上所述寻找这样一个库的人将很难找到任何东西,这个问题的答案几乎总结了所有可用的选项。 因此,这是“通常涵盖……程序员常用的软件工具”; 已接受答案的类别。

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既普遍又广泛支持。 除非这些不符合您的需求,否则我建议不要降低水平,因为您将失去平台独立性。

他们似乎面向游戏的原因仅仅是因为这是更难用的案例之一。 因此,如果你可以支持游戏,你可以支持其他应用程序想要的任何东西(缺少工作室软件)。

考虑一下低延迟的目标。 游戏需要非常低的延迟,以确保声音效果与屏幕上的动作很好地匹配。 我认为这是你想要的类似原因(所以你的声音与你的video流匹配,语音通道没有暂停)。

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


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

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

一个警告:它还不支持OSS(FreeBSD)或sndio(OpenBSD)。

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

Qt框架针对多媒体和游戏应用程序进行了非常优化,因此您不会在性能上松懈。

linphone包含mediastreamer2用于此目的