以下是一个简单的示例代码,使用C++和alsa库录制一段3秒的音频,并保存到本地。

#include <iostream>
#include <alsa/asoundlib.h>
#include <fstream>

int main() {
    // 打开默认的录音设备
    snd_pcm_t *handle;
    if (snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0) < 0) {
        std::cerr << "无法打开录音设备" << std::endl;
        return -1;
    }

    // 设置录音参数
    snd_pcm_hw_params_t *params;
    snd_pcm_hw_params_malloc(&params);
    snd_pcm_hw_params_any(handle, params);
    snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
    snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
    unsigned int sample_rate = 44100;
    snd_pcm_hw_params_set_rate_near(handle, params, &sample_rate, 0);
    snd_pcm_hw_params_set_channels(handle, params, 1);
    snd_pcm_hw_params_set_period_size_near(handle, params, NULL);
    snd_pcm_hw_params(handle, params);
    snd_pcm_hw_params_free(params);

    // 分配一个缓冲区用于存储录音数据
    snd_pcm_uframes_t frames = 32;  // 每个周期的帧数
    char *buffer = (char *) malloc(frames * sizeof(char) * 2);  // 每个帧有2个字节

    // 开始录音
    if (snd_pcm_prepare(handle) < 0) {
        std::cerr << "录音设备准备失败" << std::endl;
        return -1;
    }

    std::ofstream outfile("recorded_sound.pcm", std::ios::binary);

    std::cout << "开始录音..." << std::endl;
    for (int i = 0; i < 3 * sample_rate / frames; ++i) {
        if (snd_pcm_readi(handle, buffer, frames) != frames) {
            std::cerr << "从录音设备读取数据失败" << std::endl;
            break;
        }
        outfile.write(buffer, frames * sizeof(char) * 2);
    }
    std::cout << "录音完成" << std::endl;

    // 清理资源
    free(buffer);
    snd_pcm_close(handle);
    outfile.close();

    return 0;
}

在编译和运行该代码之前,请确保已经安装了alsa开发库,并使用以下命令进行编译:

g++ -o record_sound record_sound.cpp -lasound

然后运行生成的可执行文件:

./record_sound

该程序将录制3秒的音频,并将其保存为名为"recorded_sound.pcm"的文件

linux使用c++利用alsa库录制一段3秒录音 并保存到本地

原文地址: https://www.cveoy.top/t/topic/ioZV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录