我想建立我的第一个音频项目。我想用 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
应该足以帮助您入门。