linux使用c++利用alsa库录制一段3秒录音 并保存到本地
以下是一个简单的示例代码,使用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(¶ms);
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"的文件
原文地址: https://www.cveoy.top/t/topic/ioZV 著作权归作者所有。请勿转载和采集!