Pulseaudio

如何獲取pulseaudio輸出?

  • January 18, 2020

我想建立我的第一個音頻項目。我想用 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 文件非常有用並且寫得很好。

引用自:https://unix.stackexchange.com/questions/532042