假设我想用 C++ 编写一个音频过滤器,该过滤器应用于每个音频或特定的麦克风/源,我应该在 ubuntu 上从哪里开始?
编辑,要清楚我不知道如何做到这一点,以及 Pulseaudio、ALSA 和 Gstreamer 的作用是什么。
假设我想用 C++ 编写一个音频过滤器,该过滤器应用于每个音频或特定的麦克风/源,我应该在 ubuntu 上从哪里开始?
编辑,要清楚我不知道如何做到这一点,以及 Pulseaudio、ALSA 和 Gstreamer 的作用是什么。
Alsa提供了一个用于访问和控制音频和 MIDI 硬件的 API。ALSA 的一部分是一系列内核模式设备驱动程序,而另一部分是应用程序链接的用户空间库。Alsa 是单客户端。
PulseAudio是便于多个客户端应用程序访问单个音频接口的框架(alsa 是单客户端)。它提供了一个守护进程,它“拥有”音频接口,并为守护进程和使用它的应用程序之间的音频提供 IPC 传输。这在开源桌面环境中被大量使用。Pulse 的使用对应用程序在很大程度上是透明的——它们继续使用带有音频传输和混合的 alsa API 访问音频输入和输出。还有 Jack更多地针对“专业”音频应用程序 - 可能有点用词不当,尽管这里的意思是低延迟音乐制作工具。
gStreamer是一个基于信号图模式的通用多媒体框架,其中组件具有多个输入和输出引脚并提供转换功能。构建这些组件的图表以实现媒体解码等操作,并具有用于音频和视频输入或输出的特殊节点。它在概念上类似于 CoreAudio 和 DirectShow。 VLC和libAV都是开源的替代品,运行方式相似。您在这些之间的选择取决于 API 样式和实现语言。特别是 gStreamer 是一个用 C 实现的 OO API。VLC 是 C++。
实现您描述的问题的明显方法是实现 gStreamer/libAV/VLC 组件。如果您想处理音频然后将其路由到另一个应用程序,这可以通过将其循环回 Pulse 或 Jack 来实现。
Alsa 提供了一个插件机制,但我怀疑从 ALSA 文档中实现这一点会很困难。
用于构建您所描述类型的效果插件的事实上的架构是 Steinberg 的VST。有大量可以在 Linux 上使用的开源主机和插件示例,而且至关重要的是,有不错的文档。与 gStreamer/libAV/VLC 一样,您可以从中路由音频。
其中,VST 可能是最容易上手的。