前言

看了很长时间关于alsa音频驱动的一些中英文资料,终于把这个程序给搞出来了。这个程序实现的是在树莓派上通过usb音频采集卡进行音频采集,并直接将pcm数据保存起来,通过c语言实现。

项目地址

alsa-record-on-raspberrypi

具体代码

/* alsa-record-on-raspberrypi.c用于树莓派上通过usb音频采集卡进行音频采集,采集pcm数据并直接保存pcm数据音频参数: 声道数:       2采样位数:   16bit、LE格式采样频率:  44100Hz
*/#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>void main (int argc, char *argv[])
{int i;int err;char *buffer;int buffer_frames = 128;unsigned int rate = 44100;            // 采样频率: 44100Hzsnd_pcm_t *capture_handle;           // 一个指向PCM设备的句柄snd_pcm_hw_params_t *hw_params;      // 此结构包含有关硬件的信息,可用于指定PCM流的配置snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;        // 采样位数:16bit、LE格式FILE *sig_FOut;        // 一个指向文件的指针,文件输出流// 打开音频采集卡硬件,并判断硬件是否打开成功,若打开失败则打印出错误提示if ((err = snd_pcm_open (&capture_handle, argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) {fprintf (stderr, "cannot open audio device %s (%s)\n",  argv[1], snd_strerror (err));exit (1);}fprintf(stdout, "audio interface opened\n");/*     将流与文件之间的关系建立起来,文件名为 out_pcm.raw,并判断是否设置成功w是以文本方式打开文件,wb是二进制方式打开文件,wb+是读写打开或建立一个二进制文件,允许读和写。*/if ((sig_FOut = fopen(argv[2], "wb")) == NULL){printf("cannot open audio file for recording\n");exit (1);} fprintf(stdout, "audio file for recording opened\n");// 分配一个硬件变量对象,并判断是否分配成功if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params allocated\n");// 按照默认设置对硬件对象进行设置,并判断是否设置成功if ((err = snd_pcm_hw_params_any (capture_handle, hw_params)) < 0) {fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params initialized\n");/*设置数据为交叉模式,并判断是否设置成功interleaved/non interleaved:交叉/非交叉模式。表示在多声道数据传输的过程中是采样交叉的模式还是非交叉的模式。对多声道数据,如果采样交叉模式,使用一块buffer即可,其中各声道的数据交叉传输;如果使用非交叉模式,需要为各声道分别分配一个buffer,各声道数据分别传输。*/if ((err = snd_pcm_hw_params_set_access (capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {fprintf (stderr, "cannot set access type (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params access setted\n");// 设置数据编码格式为PCM、有符号、16bit、LE格式,并判断是否设置成功if ((err = snd_pcm_hw_params_set_format (capture_handle, hw_params, format)) < 0) {fprintf (stderr, "cannot set sample format (%s)\n",  snd_strerror (err));exit (1);}fprintf(stdout, "hw_params format setted\n");// 设置采样频率,并判断是否设置成功if ((err = snd_pcm_hw_params_set_rate_near (capture_handle, hw_params, &rate, 0)) < 0) {fprintf (stderr, "cannot set sample rate (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params rate setted\n");//  设置为双声道,并判断是否设置成功if ((err = snd_pcm_hw_params_set_channels (capture_handle, hw_params, 2)) < 0) {fprintf (stderr, "cannot set channel count (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params channels setted\n");// 将配置写入驱动程序中,并判断是否配置成功if ((err = snd_pcm_hw_params (capture_handle, hw_params)) < 0) {fprintf (stderr, "cannot set parameters (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "hw_params setted\n");// 使采集卡处于空闲状态snd_pcm_hw_params_free (hw_params);fprintf(stdout, "hw_params freed\n");// 准备音频接口,并判断是否准备好if ((err = snd_pcm_prepare (capture_handle)) < 0) {fprintf (stderr, "cannot prepare audio interface for use (%s)\n", snd_strerror (err));exit (1);}fprintf(stdout, "audio interface prepared\n");// 配置一个数据缓冲区用来缓冲数据buffer = malloc(128 * snd_pcm_format_width(format) / 8 * 2);fprintf(stdout, "buffer allocated\n");// 开始采集音频pcm数据while (1) {// 读取if ((err = snd_pcm_readi (capture_handle, buffer, buffer_frames)) != buffer_frames) {fprintf (stderr, "read from audio interface failed (%s)\n", err, snd_strerror (err));exit (1);}//fprintf(stdout, "read %d done\n", i);fwrite(buffer, (buffer_frames*2), sizeof(short), sig_FOut);fprintf(stdout, "recording...\r");}// 释放数据缓冲区free(buffer);fprintf(stdout, "buffer freed\n");// 关闭音频采集卡硬件snd_pcm_close (capture_handle);fprintf(stdout, "audio interface closed\n");// 关闭文件流fclose(sig_FOut);exit (0);
}

运行环境

树莓派系统镜像:“2018-11-13-raspbian-stretch-full.img”

使用方法:

将以上代码保存为“alsa-record-on-raspberrypi.c”,然后在linux终端上运行以下命令。
1、需要先安装“libasound2”库

     sudo apt-get install libasound2-dev

2、编译:

gcc -o alsa-record-on-raspberrypi -lasound alsa-record-on-raspberrypi.c

3、运行,按“ctrl+c”结束运行。

./alsa-record-on-raspberrypi hw:1 test.pcm
/ * PCM设备的名称,如 plughw:0,0 或 hw: 0,0 * /
/ *第一个数字是声卡的编号,* /
/ *第二个数字是设备的编号。* /

4、播放pcm裸数据进行测试(需要安装ffmpeg)。

ffplay -ar 44100 -channels 2 -f s16le -i test.pcm

参考资料:

1、A tutorial on using the ALSA Audio API
2、ALSA Programming HOWTO v.0.0.8
3、ALSA Library API - AlsaProject

树莓派上做音频采集,采集pcm数据并直接保存pcm数据相关推荐

  1. 新手学习实记(十、在树莓派上做图形化界面)

    [前言] 校内实习制作--基于树莓派的云台人脸追踪系统.本文主要是记录我的操作和执行过程. 由于要同时准备考研,所以只能学习做一个简易的系统啦,希望能有收获叭. [个人情况(供看文章的同学参考): ① ...

  2. 在树莓派上安装centos 7,并配置softether本地网桥进行数据转发

    在树莓派上安装centos7以及softether server,并配置本地网桥进行流量转发 不仅是在树莓派上可行,如果用云服务器做代理,或者进行UDP免流等操作的也可参考. 看到有的文章写到本地网桥 ...

  3. android 同步list数据,android SharedPreferences保存list数据

    释放双眼,带上耳机,听听看~! 今天,简单讲讲如何使用SharedPreferences保存list数据. 网上找了很多资料,还是觉得这种比较简单.直接上代码: 保存: public static b ...

  4. 在树莓派上做一个远程控制的小车(基于Python)

    自制基于树莓派3B的WIFI控制小车 所需材料 开发环境搭建 实现的功能 系统架构 效果 客户端实现代码 标题服务端实现代码 总结 所需材料 1.履带式底盘及电机:能适应大多数地形 2.L298N步进 ...

  5. 大数据理论体系总结--数据仓库管理与全链路数据体系

    前言 就这样,大数据领域蓬勃发展了好几年,有很多伙伴执迷于技术,成为了分布式计算与存储的领域专家.也有很多伙伴执迷于数据,成为了行业的数据研发专家.当然还有很多小伙伴,热衷于工具系统开发,成为了数据技 ...

  6. Windows上的音频采集技术比对

    [转]Windows上的音频采集技术 转自http://blog.csdn.net/wxl1986622/article/details/44230149 前一段时间接到一个任务,需要采集到声卡的输出 ...

  7. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )

    文章目录 I . AAudio 音频流 采样 缓冲 播放 的连续机制 II . AAudio 音频流 数据回调函数 函数指针类型定义 III . AAudio 音频流 数据回调函数 实现 IV . A ...

  8. Android多个音频源采集,Android音频开发之音频采集的实现示例

    在 Android 系统中,一般使用 AudioRecord 或者 MediaRecord 来采集音频. AudioRecord 是一个比较偏底层的API,它可以获取到一帧帧 PCM 数据,之后可以对 ...

  9. 在网易有数上做数据加工和数据分析的实践

    设计方案 最近在做平台的前端性能分析报告,为了快速实现这个目标,我准备借助现有的系统完成. 本次实践涉及的网易有数产品:Hubble(数据上报).数据开发及管理.有数BI. 这些产品是私有化部署的,大 ...

最新文章

  1. 创建新的apple id_Google是新的Apple吗?
  2. 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
  3. c中调用python解释器
  4. matlab怎么求矩阵的范数
  5. ITK:图像重新取样
  6. 序列化和反序列化的概念与延伸【详细解释 + 样例演示】
  7. HBase1.0.0 实现数据增删查
  8. 内置系统账户:Local system/Network service/Local Service 区别
  9. Vim winmanager文件浏览自动更新
  10. java判断句号是否对称_java 判断空格的规范度 将操作符两侧、标点符号两侧不规范的空格找出来...
  11. android studio布局文件在哪,android studio布局文件详解
  12. 佳能mp236打印机驱动 官方版
  13. 原来大家最拼命的时候是这样子的
  14. ps随意改变图层形态
  15. c#计算圆或者圆柱面积体积代码
  16. kettle 提交数据量_kettle大数据量读写mysql性能优化
  17. qq影音4.0 android,QQ影音4.0官方最新正式版
  18. python 获取项目根目录
  19. Stardust AS3粒子引擎
  20. 兴趣点推荐代码_如何解读霍兰德职业兴趣测评结果

热门文章

  1. 任意进制转换(转化器,算法,类)
  2. Key Points Estimation and Point InstanceSegmentation Approach for Lane Detection 论文精读
  3. 【CTO讲堂】SaaS云端语音通信架构详解
  4. 钛空舱模特队少女节高甜送祝福,助你永远18岁~看到流泪~
  5. QQ浏览器上线投屏功能,能投屏的不只是视频App,网站视频也能在电视播放
  6. 智芯传感硅微加速度传感器在汽车安全碰撞测试中的产品应用
  7. WPF中的形状Shape与几何图形Geometry详解
  8. clob类型类似MySQL_Oracle中大文本数据类型Clob 长文本类型 (MySQL中不支持,使用的是text)Blob 二进制类型MySQL数据库Text...
  9. 网络数据包拦截通用技术
  10. 中国船用燃料油市场供需调研与投资前景预测报告2022-2028年