加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
record.c 2.63 KB
一键复制 编辑 原始数据 按行查看 历史
刘煜 提交于 2024-03-11 22:44 . 消除编译告警
#include <alsa/asoundlib.h> //ALSA头文件
int main(int argc, char** argv)
{
snd_pcm_t* mic;
//运行时需要指定音频文件
if (argc < 2)
{
fprintf(stderr, "too few argument\n");
return EXIT_FAILURE;
}
//打开录音设备,阻塞方式
int error = snd_pcm_open(&mic, "hw:0,1", SND_PCM_STREAM_CAPTURE, 0);
if (error)
{
fprintf(stderr, "snd_pcm_open: %s\n", snd_strerror(error));
return EXIT_FAILURE;
}
//设置录音参数
snd_pcm_hw_params_t * record_param;
//在栈上分配参数内存并初始化
snd_pcm_hw_params_alloca(&record_param);
error += snd_pcm_hw_params_any(mic, record_param);
//设置采样格式(有符号16位整数,小端序)
error += snd_pcm_hw_params_set_format(mic, record_param, SND_PCM_FORMAT_S16_LE);
//设置访问方式(交错读写)
error += snd_pcm_hw_params_set_access(mic, record_param, SND_PCM_ACCESS_RW_INTERLEAVED);
//设置采样频率(16KHz)
error += snd_pcm_hw_params_set_rate(mic, record_param, 16000, 0);
//设置声道数量(单声道)
error += snd_pcm_hw_params_set_channels(mic, record_param, 1);
//根据硬件参数配置声卡
error = snd_pcm_hw_params(mic, record_param);
if (error)
{
fprintf(stderr, "snd_pcm_hw_params: %s\n", snd_strerror(error));
return EXIT_FAILURE;
}
//获取一个周期数据量,从声卡获取数据时,读写的最小单位是1个周期
snd_pcm_uframes_t nframe;
int dir = 0;
error = snd_pcm_hw_params_get_period_size(record_param, &nframe, &dir);
if (error)
{
fprintf(stderr, "snd_pcm_hw_params_get_period_size: %s\n", snd_strerror(error));
return EXIT_FAILURE;
}
printf("period = %lu frames\n", nframe);
//分配缓冲区,大小必须为周期的倍数
char* buf = malloc(snd_pcm_frames_to_bytes(mic, nframe));
//打开音频文件
FILE* fp = fopen(argv[1], "w+");
if (!fp)
{
perror("fopen");
free(buf);
return EXIT_FAILURE;
}
//开始录音
snd_pcm_prepare(mic);
while (1)
{
snd_pcm_sframes_t rframe;
//从声卡中读取数据,写入缓冲区
rframe = snd_pcm_readi(mic, buf, nframe);
if (rframe < 0)
{
fprintf(stderr, "snd_pcm_readi: %s\n", snd_strerror(rframe));
break;
}
//将音频数据写入文件
fwrite(buf, snd_pcm_frames_to_bytes(mic, rframe), 1, fp);
}
//停止录音
snd_pcm_drop(mic);
fclose(fp);
free(buf);
//关闭设备
snd_pcm_close(mic);
return 0;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化