Linux ALSA 音频采集

在原生Linux上,我们使用ALSA库进行音频采集。在安卓上,使用OpenSL ES。

下面,超哥提供一段代码给音视频开发初学者,对于认识音频参数比如

采样率,通道,位,码率有很好的帮助。

首先 sudo apt-get install libalsa-ocaml-dev 下载alsa开发库。

然后安装cmake vscode

sudo apt-get install cmake

下载vscode以后,安装cmake tools c++工具

代码中使用了Linux 信号,完整结束程序,写入pcm。

然后建议下载audacity 程序,进行播放测试。

#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
#include <alsa/asoundlib.h>

#define LSA_PCM_NEW_HW_PARAMS_API

static bool m_bRecording = true;

void stopRecording()
{
    printf("\n signal Stop recording...\n");
    m_bRecording = false;
}

int main()
{
    snd_pcm_t *handle;
    snd_pcm_hw_params_t *params;

    int ret = snd_pcm_open(&handle,"default",SND_PCM_STREAM_CAPTURE,0);
    if(ret < 0){
        fprintf(stderr,"unable to open pcm device: %s\n",snd_strerror(ret));
        exit(1);
    }

    snd_pcm_hw_params_alloca(&params);

    snd_pcm_hw_params_any(handle,params);

    snd_pcm_hw_params_set_access(handle,params,SND_PCM_ACCESS_RW_INTERLEAVED);

    snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE);

    snd_pcm_hw_params_set_channels(handle,params,2);

    int dir = 0;
    int sampleRate = 44100;
    snd_pcm_hw_params_set_rate_near(handle,params,&sampleRate,&dir);

    int frames = 32;
    snd_pcm_hw_params_set_period_size_near(handle,params,&frames,&dir);

    ret = snd_pcm_hw_params(handle,params);
    if(ret <0){
        fprintf(stderr,"unable toset hw params: %s\n",snd_strerror(ret));
        exit(1);
    }

    snd_pcm_hw_params_get_period_size(params,&frames,&dir);
    int size = frames *4;

    char* pcmBuff = (char*)malloc(size);

    unsigned int val =0;
    snd_pcm_hw_params_get_period_time(params,&val,&dir);

    FILE* pFile;
    pFile = fopen("test.pcm","wb");

    signal(SIGINT,stopRecording);

    while(m_bRecording)
    {
        ret = snd_pcm_readi(handle,pcmBuff,frames);
        if(ret == -EPIPE){
            fprintf(stderr,"overrun.... \n");
            snd_pcm_prepare(handle);
        }
        else if(ret < 0){
            fprintf(stderr,"error read: %s\n",snd_strerror(ret));
        }
        else if(ret != frames ){
            fprintf(stderr,"less read: %s\n",ret);
        }

        ret = fwrite(pcmBuff,sizeof(char),size,pFile);
        if(ret != size){
            fprintf(stderr,"less write: %s\n",ret);
        }


    }

    snd_pcm_drain(handle);
    snd_pcm_close(handle);

    free(pcmBuff);
    fclose(pFile);


    printf("audio capture exit.. \n");

    return 0;

}

然后使用cmake工具, 强烈建议Linux开发使用cmake,比makefile简单很多。

cmake_minimum_required(VERSION 3.5)

INCLUDE_DIRECTORIES("/usr/include")

add_executable(AudioCapture AudioCapture.c)

target_link_libraries(AudioCapture asound)

导入pcm到audacity注意,导入原始数据,然后正确选择你的参数比如通道,采样率才能正常播放,你也可以试试比较下各种错误的参数,比如错误的采样,播放的结果。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值