在 Ubuntu Linux 上操作音频输入缓冲区

Posted

技术标签:

【中文标题】在 Ubuntu Linux 上操作音频输入缓冲区【英文标题】:manipulating audio input buffer on Ubuntu Linux 【发布时间】:2013-01-09 19:59:27 【问题描述】:

假设我想用 C++ 编写一个音频过滤器,应用于每个音频或特定的麦克风/源,我应该在 ubuntu 上从哪里开始?

编辑,要明确的是,我不知道如何做到这一点,以及 Pulseaudio、ALSA 和 Gstreamer 的作用是什么。

【问题讨论】:

【参考方案1】:

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 提供了一个plug-in mechanism,但我怀疑从 ALSA 文档中实现它会很困难。

构建您描述的那种类型的效果插件的实际架构是 Steinberg 的VST。有大量可以在 Linux 上使用的开源主机和插件示例,而且至关重要的是,还有不错的文档。与 gStreamer/libAV/VLC 一样,您可以从中路由音频。

其中,VST 可能是最容易上手的。

【讨论】:

VST 的问题是主机应该有一个 VST 插件基础设施,我只想编写一个过滤器,然后让用户决定是否使用这个过滤器,而不需要切换到其他应用程序继续使用他习惯的录音应用。 @user1824407 从您的描述和此评论中,我了解到您希望将过滤器任意应用于现有应用程序。由于 Linux 桌面的普及和缺乏标准化,我很确定您将需要拦截音频输入,将其路由到运行过滤器的应用程序,然后通过 Jack 或 Pulse 回到应用程序。跨度>

以上是关于在 Ubuntu Linux 上操作音频输入缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

在 LInux 上播放 PCM 音频(wav)[关闭]

如何在 linux 上使用 ffmpeg 录制音频?

指数频率轴的 FFTW

捕获从端口音频写入输出音频设备的音频输出

怎么在linux下驱动usb摄像头

DirectSound---输出设备基本操作(枚举查询等)