使用alsa-lib实现录音

虽然网上已经有了很多的参考资料,但是不是很详细,而且注释也很少。有些看起来似懂非懂,所以在我这里提供了一版详细的实现代码,方便大家一起学习。

头文件的声明在 alsa_record.h

#ifndef COM_HXIONG_ALSA_RECORD_H
#define COM_HXIONG_ALSA_RECORD_H

//宏定义
#define RECORD_FAIL   -1
#define RECORD_SUCCESS 0
#define RECORD_SAMPLE_RATE      8000
#define RECORD_BUFFER_TIME_MAX  500000
#define RECORD_DEVICE_NAME      "hw:0,1"


//wav 格式的文件头
typedef struct{
    char chunk_id[4];   /* "RIFF" */
    char chunk_size[4]; /* file total size - 8(byte) */
    char format[4];    /* "WAVE" */

    /* sub-chunk "fmt" */
    char sub_chunk_id[4];   /* "fmt " */
    char sub_chunk_size[4]; /* 16 for PCM */
    char audio_format[2];   /* PCM = 1*/
    char audio_channels[2];   /* Mono = 1, Stereo = 2, etc. */
    char samplerate[4];    /* 8000, 44100, etc. */
    char byterate[4];  /* = SampleRate * NumChannels * BitsPerSample/8 */
    char block_align[2];    /* = NumChannels * BitsPerSample/8 */
    char bits_persample[2]; /* 8bits, 16bits, etc. */
    //char fmt_chunk_end[2];  /* 附加的两个数据,值为0 */

    /* sub-chunk "data" */
    char sub_chunk2_id[4];   /* "data" */
    char sub_chunk2_size[4]; /* data size */
} wav_format_t;



//自定义的结构体参数,目的时为了把command 中的参数最一层转换,到do_alsa_record 会再转成record_handle_t 中参数
typedef struct{
        int duration;  //录制的时长
        int format;    //录制的pcm格式
        int rate;      //采样率
        int channel;   //channel 个数
        // 如有需要其他参数可以继续添加
} record_params_t;
//path 为录制的wav音频文件的保存路径
int do_alsa_record(char* path,record_params_t* params);

#endif

真正实现录音功能的c文件在 alsa_record.c

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <alsa/asoundlib.h>  //alsa-lib相关的头文件
#include "alsa_record.h"

//wav 的文件头定义,一些固定的参数先赋值
static wav_format_t wav_format={
    {'R','I','F','F'}, //RIFF
    {0,0,0,0}, //之所以定义成char,是因为保存int 的方式不一样,比如1,可存为00 00 00 01 ,或者01 00 00 00
    {'W','A','V','E'},  //WAVE
    {'f','m','t',' '},  //fmt 后面有一个空格
    {16,0,0,0}, //一般为00000010H,若为00000012H则说明数据头携带附加信息,这里设成10h,如果设成12h,需要加上fmt_chunk_end
    {1,0}, //PCM = 1
    {
  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值