在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例多媒体编程 → Linux下alsa直接录音代码

Linux下alsa直接录音代码

多媒体编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.32M
  • 下载次数:17
  • 浏览次数:366
  • 发布时间:2021-01-18
  • 实例类别:多媒体编程
  • 发 布 人:husha001
  • 文件格式:.rar
  • 所需积分:5
 相关标签: linux LIN 指令 sa 代码

实例介绍

【实例简介】

基于alsa,linux音频采集实现

【实例截图】

【文件目录】

AudioSamplingApp

├── AudioSamplingApp.cpp
├── AudioSamplingApp.vcxproj
├── AudioSamplingApp.vcxproj.filters
├── ReadMe.txt
├── build
│   ├── CMakeLists.txt
│   ├── aconfig.h
│   ├── formats.h
│   ├── gettext.h
│   └── version.h
└── x64
    └── Debug
        ├── AudioSamplingApp.Build.CppClean.log
        ├── AudioSamplingApp.log
        ├── AudioSamplingApp.obj
        ├── AudioSamplingApp.tlog
        │   ├── AudioSamplingApp.lastbuildstate
        │   ├── CL.command.1.tlog
        │   ├── CL.read.1.tlog
        │   ├── CL.write.1.tlog
        │   ├── link.command.1.tlog
        │   ├── link.read.1.tlog
        │   └── link.write.1.tlog
        ├── audiosamplingapp.obj.enc
        ├── vc140.idb
        └── vc140.pdb

4 directories, 22 files


【核心代码】

int InitAudioCodec() 
{
snd_pcm_stream_t stream = SND_PCM_STREAM_CAPTURE;
snd_pcm_hw_params_t *hwparams;
snd_pcm_info_t *info;
snd_pcm_uframes_t* frames;
char* buffer;
int size;

//char *pcm_name = "default";
char *pcm_name = "hw:1,0";

snd_pcm_info_alloca(&info);

int err = snd_output_stdio_attach(&log, stderr, 0);
assert(err >= 0);

int ret, dir;
//打开设备
ret = snd_pcm_open(&pcm_handle, pcm_name, SND_PCM_STREAM_CAPTURE, 0);
if (ret < 0)
{
printf("unable to open device : %s\n", snd_strerror(ret));
exit(1);
}

snd_pcm_hw_params_alloca(&hwparams);

//使用默认参数
snd_pcm_hw_params_any(pcm_handle, hwparams);

//翻译
snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);

//S16小端
snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S16_LE);

//单通道
snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 1);

//采样率
//int val = 44100;
int val = 16000;
snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &val, 0);

//frames = 32;
if (buffer_time == 0 && buffer_frames == 0) 
{
int err = snd_pcm_hw_params_get_buffer_time_max(hwparams,
&buffer_time, 0);
assert(err >= 0);
if (buffer_time > 500000) 
{
buffer_time = 500000;
}
}

if (period_time == 0 && period_frames == 0) 
{
if (buffer_time > 0) 
{
period_time = buffer_time / 4;
}
else 
{
period_frames = buffer_frames / 4;
}
}

if (period_time > 0) 
{
err = snd_pcm_hw_params_set_period_time_near(pcm_handle, hwparams,
&period_time, 0);
}
else 
{
err = snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams,
&period_frames, 0);
}

//frames = 32;
//snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, frames, 0);

if (buffer_time > 0) 
{
err = snd_pcm_hw_params_set_buffer_time_near(pcm_handle, hwparams,
&buffer_time, 0);
}
else 
{
err = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams,
&buffer_frames);
}

//参数生效
ret = snd_pcm_hw_params(pcm_handle, hwparams);
if (ret < 0)
{
fprintf(stderr, "unable to set hw parameters:%s\n", snd_strerror(ret));
exit(1);
}

//得到一个周期的数据大小
snd_pcm_hw_params_get_period_size(hwparams, &chunk_size, 0);
snd_pcm_hw_params_get_buffer_size(hwparams, &buffer_size);

//设置一个周期的时间长度
//snd_pcm_hw_params_get_period_time(hwparams, &val,0);

snd_pcm_start(pcm_handle);

snd_pcm_state_t pcm_state = snd_pcm_state(pcm_handle);
printf("State: %s\n", print_pcm_state(pcm_state));

return 0;
}

int SamplingAudio(char** pbuf, int* nsize)
{
snd_pcm_state_t pcm_state = snd_pcm_state(pcm_handle);
if (pcm_state == SND_PCM_STATE_XRUN)
{
int nRet;
if ((nRet = snd_pcm_prepare(pcm_handle)) < 0)
{
printf("xrun(DRAINING): prepare error: %s", snd_strerror(nRet));
return -1;
}
}
else if (pcm_state == SND_PCM_STATE_PREPARED)
{
snd_pcm_start(pcm_handle);
return -1;
}

int count = *nsize;
while (count > 0)
{
int ret = snd_pcm_readi(pcm_handle, *pbuf, count);
if (ret == -EAGAIN || (ret >= 0 && (size_t)ret < count))
{
snd_pcm_wait(pcm_handle, 100);
}
else if (ret == -EPIPE)
{
fprintf(stderr, "overrun occurred\n");
snd_pcm_prepare(pcm_handle);
//return -3;
}
else if (ret == -ESTRPIPE)
{
while ((ret = snd_pcm_resume(pcm_handle)) == -EAGAIN)
{
sleep(1);  /* wait until resume flag is released */
}

if (ret < 0)
{
snd_pcm_prepare(pcm_handle);
}
}
else if (ret < 0)
{
printf(" error from read: %s", snd_strerror(ret));

return -3;
}

if (ret > 0)
{
static FILE* g_enfp = NULL;
if (!g_enfp)
{
char file_name_264[256] = { 0 };
snprintf(file_name_264, 256, "./AudioSamplingApp.cm");
g_enfp = fopen(file_name_264, "wb");
}

if (g_enfp)
{
fwrite(*pbuf, 1, count, g_enfp);
}

count -= ret;
}
}
return 0;
}



标签: linux LIN 指令 sa 代码

实例下载地址

Linux下alsa直接录音代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警