You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux下用PipeWire实现类似WASAPI的默认音频回环采集?

Linux下基于PipeWire实现系统音频回环采集(适配clwglava的AudioCapture类)

核心思路

PipeWire原生支持输出设备的monitor端口,这和Windows WASAPI的回环采集逻辑完全对应——无需额外内核模块或手动创建回环设备,直接捕获系统输出的音频流。

移植AudioCapture类的关键步骤

1. 依赖准备

确保系统安装PipeWire开发库,Debian/Ubuntu系可执行:

sudo apt install libpipewire-0.3-dev libspa-0.2-dev

2. 初始化PipeWire环境

在AudioCapture类的初始化方法中,完成PipeWire上下文、主循环的创建:

#include <pipewire/pipewire.h>
#include <spa/param/audio/format-utils.h>

struct pw_main_loop *loop;
struct pw_context *context;
struct pw_core *core;
struct pw_stream *stream;

// 初始化PipeWire核心组件
pw_init(NULL, NULL);
loop = pw_main_loop_new(NULL);
context = pw_context_new(pw_main_loop_get_loop(loop), NULL, 0);
core = pw_context_connect(context, NULL, 0);

3. 绑定默认输出设备的Monitor端口

PipeWire的输出设备自带monitor端口,通过指定流角色为Monitor,自动连接到系统默认输出的回环流:

// 定义音频数据处理回调
static void on_process(void *data, struct pw_stream *stream);

static const struct pw_stream_events stream_events = {
    PW_VERSION_STREAM_EVENTS,
    .process = on_process,
};

// 配置音频格式(根据FFT需求调整,示例为44100Hz、16位立体声)
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(NULL, 0);
const struct spa_pod *params[1];
params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat,
                &SPA_AUDIO_INFO_RAW_INIT(
                    .format = SPA_AUDIO_FORMAT_S16_LE,
                    .channels = 2,
                    .rate = 44100));

// 创建Monitor流
stream = pw_stream_new(core, "clwglava-audio-capture",
            pw_properties_new(
                PW_KEY_MEDIA_TYPE, "Audio",
                PW_KEY_MEDIA_CATEGORY, "Capture",
                PW_KEY_MEDIA_ROLE, "Monitor",
                NULL));

pw_stream_add_listener(stream, &stream_listener, &stream_events, NULL);
pw_stream_connect(stream, PW_DIRECTION_INPUT, PW_ID_ANY,
            PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS,
            params, 1);

4. 音频数据回调与FFT传递

在on_process回调中提取音频缓冲区数据,直接传递给FFT处理模块:

static void on_process(void *data, struct pw_stream *stream) {
    struct pw_buffer *buffer;
    struct spa_buffer *spa_buf;
    int16_t *samples;
    size_t sample_count;

    if (!(buffer = pw_stream_dequeue_buffer(stream))) {
        pw_log_warn("out of buffers: %m");
        return;
    }

    spa_buf = buffer->buffer;
    samples = spa_buf->datas[0].data;
    sample_count = spa_buf->datas[0].chunk->size / sizeof(int16_t);

    // 将音频数据传入FFT处理逻辑
    your_fft_process_function(samples, sample_count);

    pw_stream_queue_buffer(stream, buffer);
}

5. 资源清理

在类的析构方法中释放PipeWire资源:

pw_stream_disconnect(stream);
pw_stream_destroy(stream);
pw_core_disconnect(core);
pw_context_destroy(context);
pw_main_loop_destroy(loop);
pw_deinit();

注意事项

  • 现代Linux发行版(如Ubuntu 22.04+、Fedora 34+)已默认使用PipeWire作为音频服务,无需额外切换
  • 若需要格式转换(如FFT要求浮点型数据),可通过PipeWire的spa-audio-convert模块自动处理,无需手动编码转换
  • 普通用户默认拥有PipeWire音频访问权限,无需额外配置权限

内容的提问来源于stack exchange,提问作者Spandan Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:47:23