跨平台声音API

时间:2012-06-22 06:39:48

标签: c++ c audio voip live-streaming

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

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

主要要求是

  1. 从所选麦克风/麦克风获取音频以通过网络发送
  2. 将数据发送到选择的输出设备,
  3. 处理声音(过滤,清理噪音,多路复用流等)但这可以在我拥有音频数据后完成,库本身不需要能够执行任何此操作。
  4. 具有相当低的延迟
  5. 我主要担心的是,这些提到的API似乎主要针对游戏(声音通常从磁盘加载,并且没有太多(如果有的话)录音而不是通过网络流式传输,在录制和录制之间具有同等重要性。回放。

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

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

5 个答案:

答案 0 :(得分: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。那是(好极了!)给我的消息,但确实如此。

答案 1 :(得分:2)

我认为SDL和OpenAL既普遍又受到广泛支持。除非这些不符合您的需求,否则我建议不要降低水平,因为您将失去平台独立性。

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

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

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


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

答案 2 :(得分:2)

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

有一点需要注意:它还不支持OSS(FreeBSD)或sndio(OpenBSD)。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

linphone包含mediastreamer2用于此目的