【实例简介】

基于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直接录音代码相关推荐

  1. linux 中断 应用程序,Linux中断编程

    本文转载自[微信公众号:机械猿,ID:on_ourway]经微信公众号授权转载,如需转载与原文作者联系 基本概念 中断是指CPU在执行程序时,由于内外部事件或由程序预先安排的事件,导致CPU 暂停当前 ...

  2. linux 查找某个程序,Linux查找特定程序whereis实例详解

    Linux 查找特定程序 whereis whereis 命令主要用于查找程序文件,并提供这个文件的二进制可执行文件.源代码文件和使用手册存放位置. 1.查找命令程序 例如,查找 touch 命令 [ ...

  3. linux服务端 程序,linux服务端程序tunning过程简要总结

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 步骤1:网络丢包的原因定位 ethtool -S eth0 rx_dropped代表丢包发生在linux 内核缓冲区,丢 ...

  4. linux亮度调节程序,linux调节屏幕亮度

    新建三个文本文件并给予执行权限: up.sh if [ ! -w /sys/class/backlight/intel_backlight/brightness ];then echo "p ...

  5. android录音程序,使用MediaRecorder编写Android 录音程序

    类型:音频处理大小:2.0M语言:中文 评分:3.3 标签: 立即下载 今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以 ...

  6. java 调用window程序_Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...

  7. linux连接到程序,Linux下C程序的链接过程

    今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识! 这个程序的就是写一个简单的输出"hello World!": 要求:1.不使用C运行库,写一 ...

  8. linux 查看端口 程序,linux开发:Linux下查看端口占用

    前段时间有学生问到,怎么查看 linux系统中已经被占用的端口?下面就统一给大家解释一下. 提到端口,那首先来回顾端口定义,为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别 ...

  9. linux 跑java程序_Linux下独立执行Java程序

    Linux系统里,很多时候因为种种原因,需要把java程序单独执行,而不是在web容器环境下执行,这时候很多容器资源是无法直接取到的,比如数据库连接池配置的数据源等等,还有就是程序运行需要的第三方ja ...

最新文章

  1. python app模块_pythonWeb框架创建app模块以及虚拟环境管理工具
  2. Spring MVC应用程序中的Thymeleaf模板布局,无扩展
  3. python画羊_羊车门作业 Python版
  4. “git push”后返回“Error 403”解决方法
  5. 计算机:游戏14,英语专四作文满分范文(十四):电脑游戏
  6. day 05 字典dic(增删改查 嵌套)
  7. mqtt 变为乱码 接受16进制字节流_常见乱码问题分析和总结
  8. http长轮询短轮询
  9. 微信小程序动画效果集合
  10. 用强化学习来玩Atari游戏(基于Tensorflow的深度Q学习模型)
  11. 拼多多36W+的后端面经
  12. 基于python的大米粒分割(本文适合两个凹点的粘连物体)
  13. 多元线性回归拟合公式
  14. “任期”已近20年,这个AI训练工具有点儿问题
  15. Verilog——半加器详解
  16. Java反射--藤原豆腐店自用
  17. js实现图片裁剪功能
  18. 大数据面试3分钟自我介绍_大数据面试要注意哪些方面?大数据面试准备三大攻略...
  19. PC和DSP通信以及MCU和DSP通信之间的切换
  20. 6. 小A的糖果(普及-)

热门文章

  1. 2014末,Surface Pro 3叫好不叫座只是价格问题?
  2. mysql数据库query cache
  3. android listview item点击时更改textview的颜色 代码中实现
  4. Redhat和ubuntu的区别
  5. OCS 2007 R2环境搭建DC上的准备工作
  6. 一次批量修改博客文章的经验(下):操作过程
  7. java 二叉树的深度、平衡二叉树、二叉树的下一个结点
  8. python中argsort,sort 和 sorted,operator.itemgetter函数
  9. EasyNetQ介绍
  10. 控件包含代码块(即 % ... %),因此无法修改控件集合。