alsa参数配置和声道分离

前言

读取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(&params);              //为硬件参数分配空间             
    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);    
	  }
}

总结

本章介绍了在设置双声道录音的情况下,如何分别获取左右声道的方法;仅供参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LinfineEdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值