如何获取脉冲音频输出?

如何获取脉冲音频输出?

我想建立我的第一个音频项目。我想用 OpenGL 创建一个可视化工具。相信我,我做了许多独特的设计,作为可视化工具看起来很棒。

我想获取pulseaudio的输出,然后对其进行FFT,然后基于此绘制图案。但我不明白第一点,如何抓取pulseaudio输出?

simplescreenrecorder 和 cli-visualizerprogrammer 等程序是完美运行的两个实例。

谁能建议我如何获取pulseaudio的原始输出来对其进行FFT?

答案1

建立在我写的德克特答案之上一个小程序它获取 PulseAudio 的默认接收器并将原始 PCM 数据写入文件。假设您已启动并运行 PulseAudio 客户端,您需要首先请求 PA 服务器信息:

pa_context_get_server_info(ctx, &pa_server_info_cb, nullptr /*userdata*/);

服务器信息结构保存默认接收器名称。这就是音频到达声卡的“位置”。正如 dirkt 所说,我们可以连接到sink_name.monitor监听所述接收器。

为此,首先创建一个新流,然后设置回调,最后连接它进行录制。

void pa_server_info_cb(pa_context *ctx, const pa_server_info *info, void* /*userdata*/)
{
    pa_sample_spec spec;
    spec.format = PA_SAMPLE_S16LE;
    spec.rate = 44100;
    spec.channels = 1;
    pa_stream *stream = pa_stream_new(ctx, "output monitor", &spec, nullptr);

    pa_stream_set_state_callback(stream, &pa_stream_notify_cb, nullptr /*userdata*/);
    pa_stream_set_read_callback(stream, &pa_stream_read_cb, nullptr /*userdata*/);

    std::string monitor_name(info->default_sink_name);
    monitor_name += ".monitor";
    if (pa_stream_connect_record(stream, monitor_name.c_str(), nullptr, PA_STREAM_NOFLAGS) != 0) {
        std::cerr << "Failed to connect for recording\n";
        return;
    }
}

在里面读取回调数据可通过 获得pa_stream_peek()。请务必参考pa_stream_peek() 文档pa_stream_drop()偷看之后什么时候去!

在编程时,我发现PulseAudio API 文档非常有用并且写得很好。

答案2

您不会“抓取”Pulseaudio 输出。

pavucontrol执行与output选项卡功率电平计相同的操作:连接到.monitor接收器的输入,从中读取声音数据,以您喜欢的任何方式可视化。根据需要处理尽可能多的水槽。

的源代码pavucontrol应该足以帮助您入门。

相关内容