Linux音频采集和在国产化平台中遇到的坑(一)

本文介绍在基于国产芯片的银河麒麟系统中使用ALSA进行音频采集的方法及遇到的问题。详细展示了ALSA音频采集的关键函数与步骤,并分享了在国产化平台上的特殊挑战。

Linux音频采集和在国产化平台中遇到的坑(一)

最近在做一个国产化平台的软件项目的开发,是基于国产芯片的银河麒麟系统。其中有一个重要模块,是采集和播放音频数据,播放不用多说了,采集的话,包括采集麦克风和采集桌面系统声音。很多人都觉得银河麒麟不就是linux么,那不直接用ALSA就好了,我原本也是这么想的,但是实际开发下来才发现,还是有各种坑需要自己去趟的。这里我简单记录一下。

虽然都是linux,芯片也是基于同样的架构,同样的指令集,但是考虑到芯片的实现毕竟是不同的,于是所有涉及到硬件交互的软件部分,也会有所差异,最终会导致了有些应用层面的接口,不能按照普通linux的通常用法去使用。

linux ALSA音频采集

首先,银河麒麟既然是linux系统,那首先考虑到的是通过ALSA(Advanced Linux Sound Architecture)来进行采集,ALSA是linux的默认声卡驱动,同时在用户层还有一个ALSA Lib来供应用程序调用,它的整体上的结构图是这个样子的:
在这里插入图片描述

应用程序通常都是通过alsa-lib来使用,如果系统没有的话,可以通过命令安装开发库,就可以使用了。例如

sudo apt-get install libasound2-dev

另外需要注意一点的是,如果是android系统,那么系统里通常是不存在alsa的,而是它的简化版tiny-alsa,接口名称也不一样,但是大致调用流程是相同的。

alsa音频采集,有几个关键函数

#include <sys/asoundlib.h>

/***
 创建alsa pcm handle去连接设备
 @param handle: 返回创建的PCM handle
 @param name: 设备名称,ASCII编码
 @param stream: 标明采集或者播放(SND_PCM_STREAM_CAPTURE, SND_PCM_STREAM_PLAYBACK)
 @param mode: 打开模式(see SND_PCM_NONBLOCK, SND_PCM_ASYNC)
 @return: 0表示成功,小于0表示错误
*/
int snd_pcm_open( snd_pcm_t **handle, const char* name, int stream, int mode );

/***
 读取音频帧
 @param handle: PCM handle
 @param buffer: frames containing buffer
 @param size: frames to be read
 @return: 实际读取的音频帧个数,小于0表示错误
*/
ssize_t snd_pcm_readi( snd_pcm_t *handle, void *buffer, size_t size );

/***
 关闭
 @param handle: PCM handle
 @return: 实际读取的音频帧个数,小于0表示错误
*/
int snd_pcm_close( snd_pcm_t *handle );

/***
 准备使用PCM
 @param handle: PCM handle
 @return: 实际读取的音频帧个数,小于0表示错误
*/
int snd_pcm_prepare( snd_pcm_t *handle 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值