前言
读取alsa声道数据,可以设置读取双声道还是单声道数据,在设置读取双声道参数后,会读到左右双声道的数据,如何进行分离那?本章介绍如何将左右声道分离的方法;
一、实践过程
下面直接上代码,首先打开音频设备,然后设置读取数据的参数,包括大小端,采样频率等参数,如下代码展示如何获取双声道数据:
rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0); //首先要打开设备
if (rc < 0)
{
fprintf(stderr, "unable to open pcm device: %s/n", snd_strerror(rc));
exit(1);
}
snd_pcm_hw_params_alloca(¶ms); //为硬件参数分配空间
snd_pcm_hw_params_any(handle, params); //设置硬件参数默认值
/* 下面这些参数是你想要DIY的 */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED); //设置为Interleaved模式
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE); //设置采样结果为16bit小端
snd_pcm_hw_params_set_channels(handle, params, 2); //设置为双声道 即stereo,如果你想要分析单声道的音频可以设置为单声道,或者做声道分离的工作
val = 96000; //这里设置采样率96k,想想奈奎斯特定理,这个采样率可以还原48k的音频,哈哈,超声
snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);
/* Set period size to 32frames. */
frames = 1024;
snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);
rc = snd_pcm_hw_params(handle, params); //最后这里是将你设置的参数回写到硬件参数里 这样参数设置就结束了
if (rc < 0)
{
fprintf(stderr, "unable to set hw parameters: %s/n",
snd_strerror(rc));
exit(1);
}
可以去参阅alsa官网提供的example,但是有几个问题要注意,由于codec不同,支持的采样率也是有所差别的,一定要去看看你的codec源码中是否支持你要的采样频率,或者从datasheet中去确认下,曾经被坑过。
在获取到双声道数据后,下面需要进行声道数据分离,前面设置采样为16bit小端还记得吧,双声道,数据格式排布如下:
| 左声道16位 | 右声道16位 | 左声道16位 | 右声道16位 | 这样的格式,那么声道分离就可以分段截取,代码如下:
void separateChannel(char * buffer, short *lefeChannel)
{
int i = 0;
for (i = 0; i < MAXBUFFERSIZE; i++)
{
*(lefeChannel+i) = *(short *)(buffer + 4 * i);
}
}
总结
本章介绍了在设置双声道录音的情况下,如何分别获取左右声道的方法;仅供参考