最初のオーディオプロジェクトを作りたいです。 OpenGLを使って可視化ツールを作成したいと思います。私を信じてください。私はビジュアライゼーションツールで見栄えの良いユニークなデザインをたくさん作りました。
私はpulseaudioの出力を取得してFFTを実行し、それに基づいてパターンを描きたいと思います。しかし、最初のポイントは、パルスオーディオ出力を取得する方法を理解していません。
simplescreenrecorderやcli-visualizerprogrammerなどのプログラムは、完全に機能する2つの例です。
パルスオーディオの生出力をFFTする方法を提案できる人はいますか?
答え1
私が書いたDecterの答えに基づいて小さなプログラム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
始めるのに十分です。