linux alsa 录音程序,Linux下alsa直接录音代码
【实例简介】
基于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 alsa 录音程序,Linux下alsa直接录音代码相关推荐
- linux 中断 应用程序,Linux中断编程
本文转载自[微信公众号:机械猿,ID:on_ourway]经微信公众号授权转载,如需转载与原文作者联系 基本概念 中断是指CPU在执行程序时,由于内外部事件或由程序预先安排的事件,导致CPU 暂停当前 ...
- linux 查找某个程序,Linux查找特定程序whereis实例详解
Linux 查找特定程序 whereis whereis 命令主要用于查找程序文件,并提供这个文件的二进制可执行文件.源代码文件和使用手册存放位置. 1.查找命令程序 例如,查找 touch 命令 [ ...
- linux服务端 程序,linux服务端程序tunning过程简要总结
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 步骤1:网络丢包的原因定位 ethtool -S eth0 rx_dropped代表丢包发生在linux 内核缓冲区,丢 ...
- linux亮度调节程序,linux调节屏幕亮度
新建三个文本文件并给予执行权限: up.sh if [ ! -w /sys/class/backlight/intel_backlight/brightness ];then echo "p ...
- android录音程序,使用MediaRecorder编写Android 录音程序
类型:音频处理大小:2.0M语言:中文 评分:3.3 标签: 立即下载 今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以 ...
- java 调用window程序_Windows下Java调用可执行文件代码实例
这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...
- linux连接到程序,Linux下C程序的链接过程
今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识! 这个程序的就是写一个简单的输出"hello World!": 要求:1.不使用C运行库,写一 ...
- linux 查看端口 程序,linux开发:Linux下查看端口占用
前段时间有学生问到,怎么查看 linux系统中已经被占用的端口?下面就统一给大家解释一下. 提到端口,那首先来回顾端口定义,为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别 ...
- linux 跑java程序_Linux下独立执行Java程序
Linux系统里,很多时候因为种种原因,需要把java程序单独执行,而不是在web容器环境下执行,这时候很多容器资源是无法直接取到的,比如数据库连接池配置的数据源等等,还有就是程序运行需要的第三方ja ...
最新文章
- python app模块_pythonWeb框架创建app模块以及虚拟环境管理工具
- Spring MVC应用程序中的Thymeleaf模板布局,无扩展
- python画羊_羊车门作业 Python版
- “git push”后返回“Error 403”解决方法
- 计算机:游戏14,英语专四作文满分范文(十四):电脑游戏
- day 05 字典dic(增删改查 嵌套)
- mqtt 变为乱码 接受16进制字节流_常见乱码问题分析和总结
- http长轮询短轮询
- 微信小程序动画效果集合
- 用强化学习来玩Atari游戏(基于Tensorflow的深度Q学习模型)
- 拼多多36W+的后端面经
- 基于python的大米粒分割(本文适合两个凹点的粘连物体)
- 多元线性回归拟合公式
- “任期”已近20年,这个AI训练工具有点儿问题
- Verilog——半加器详解
- Java反射--藤原豆腐店自用
- js实现图片裁剪功能
- 大数据面试3分钟自我介绍_大数据面试要注意哪些方面?大数据面试准备三大攻略...
- PC和DSP通信以及MCU和DSP通信之间的切换
- 6. 小A的糖果(普及-)
热门文章
- 2014末,Surface Pro 3叫好不叫座只是价格问题?
- mysql数据库query cache
- android listview item点击时更改textview的颜色 代码中实现
- Redhat和ubuntu的区别
- OCS 2007 R2环境搭建DC上的准备工作
- 一次批量修改博客文章的经验(下):操作过程
- java 二叉树的深度、平衡二叉树、二叉树的下一个结点
- python中argsort,sort 和 sorted,operator.itemgetter函数
- EasyNetQ介绍
- 控件包含代码块(即 % ... %),因此无法修改控件集合。