跨平台声音API

msa*_*sam 9 c c++ audio voip live-streaming

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

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

主要要求是

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

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

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

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

Bjo*_*che 7

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.这对我很好(很棒!)新闻,但确实如此.