虽然网上已经有了很多的参考资料,但是不是很详细,而且注释也很少。有些看起来似懂非懂,所以在我这里提供了一版详细的实现代码,方便大家一起学习。
头文件的声明在 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
{