펄스 오디오 출력을 얻는 방법은 무엇입니까?

펄스 오디오 출력을 얻는 방법은 무엇입니까?

첫 번째 오디오 프로젝트를 만들고 싶습니다. OpenGL을 사용하여 시각화 도구를 만들고 싶습니다. 저를 믿으세요. 저는 시각화 도구로 훌륭해 보이는 독특한 디자인을 많이 만들어 왔습니다.

저는 pulseaudio의 출력을 가져와서 FFT를 수행하고 이를 기반으로 패턴을 그리고 싶습니다. 하지만 첫 번째 요점, 펄스 오디오 출력을 얻는 방법을 이해하지 못합니다.

simplescreenrecorder 및 cli-visualizerprogrammer와 같은 프로그램은 완벽하게 작동하는 두 가지 예입니다.

펄스 오디오의 원시 출력을 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 출력을 "잡지" 않습니다.

pavucontroloutput탭 전력 레벨 미터와 동일한 작업을 수행합니다 . .monitor수신기의 입력에 연결하고, 여기에서 사운드 데이터를 읽고, 원하는 방식으로 시각화합니다. 필요한만큼 싱크대를 처리하십시오.

소스 코드는 pavucontrol시작하기에 충분해야 합니다.

관련 정보