Pulseaudio
如何獲取pulseaudio輸出?
我想建立我的第一個音頻項目。我想用 OpenGL 創建一個視覺化工具。相信我,我已經做出了許多獨特的設計,看起來很棒。
我想從pulseaudio獲取輸出,然後對其進行FFT,然後根據它繪製模式。但是我不明白第一點,如何抓取pulseaudio輸出?
像 simplescreenrecorder 和 cli-visualizer 程序員這樣的程序是完美執行的兩個實例。
誰能建議我如何從pulseaudio獲取原始輸出來做FFT?
在 dirkt 的回答之上,我編寫了一個小程序,它抓取 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 文件非常有用並且寫得很好。