9

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

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

主要要求将是

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

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

是否有人对这些或其他声音 API 或在各自操作系统的 API 中实现这一点的优点/缺点有任何指示/警告/建议?

注意:虽然这样:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话”,但当人们也认为“作为他们往往会吸引固执己见的答案和垃圾邮件”,那么我认为这个问题不应该被关闭。寻找所描述的此类库的人将很难找到任何东西,这个问题的答案实际上总结了所有可用的选项。因此,这在“通常涵盖……程序员常用的软件工具”中;接受答案的类别。

4

5 回答 5

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。这对我来说是(太棒了!)新闻,但它确实存在。

于 2012-06-22T16:27:06.560 回答
2

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

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

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

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


我发现另一个叫SFML,其中包括录音支持。我对它了解不多,但我已经看到它可以替代 SDL。

于 2012-06-22T07:20:08.337 回答
2

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

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

于 2015-10-24T19:30:44.330 回答
1

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

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

于 2012-06-22T07:53:21.660 回答
-1

linphone 包含用于此确切目的的 mediastreamer2

于 2012-07-08T10:36:51.127 回答