吵吵前在研究一个问题,即在linux下怎么把从话筒中输入的声音记录下来成为一个wav文件,又或者再压缩一下,在网路上进行传输。没曾想到的是原来单单是获取音频已经是一个大大的问题了,搞了一晚都没有成功的采集到呢,alsa比oss确实是麻烦多了。
OSS全称是Open Sound System,即是linux下的声卡驱动架构,它提供了主要的一些api函数,音频进行操作的。早期的linux下声卡多是用这种架构的,但是它有一个缺点就是不支持混音,而且都不能同时操作声卡。但是OSS的好处在于,它提供的api很简单也很易用,例如需要采集音频的话,只需要open /dev/dsp就行了,然后就是read出来音频数据。
这种基于dsp的编程很简单,大概就是打开设备、设置声道、设置采样格式、设置采样频率、录音、播放、关闭设备了,这里的代码网上一堆,我也不再贴了。看看这段代码吧,就是打开设备的代码:
1: int handle = open("/dev/dsp", O_WRONLY);
2:
3: if (handle == -1) {
4:
5: perror("open /dev/dsp");
6:
7: return -1;
8:
9: }
为什么会说到这段代码,因为吵吵在ubuntu下实验采集音频的时候总是出现open faild /dev/dsp not found之类的错误,意思即是打开设备失败,dsp不存在。这是个什么问题?因为现在的linux系统已经不用OSS了,都用alsa了。
ALSA全称是Advanced Linux Sound Architecture,在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound System,开放声音系统),所以以上我们的编程就是无用功。ALSA的好处在于提供了软件混音等功能,坏处也显而易见,至少对开发者来说,一堆的函数让人摸不着头脑。
要写基于ALSA声卡驱动框架的音频采集程序,我们需要先下载和安装lasa-lib,这个需要去它的官网下载,然后安装就是linux下的基本程序安装步骤了
./configure
make
make install
安装好了,我们找到官网的一个例子试了一下,但是编译的时候老是提示里面的诸多函数没有定义,即undefined。怎么办呢?那是还要链接库,类似使用多线程需要在编译时候加入-lpthread,这里加入-lasound就能编译通过了。至于里面的函数到底怎么弄,麻烦您去看看官网的说明,吵吵觉得真的是太繁琐了,原本以为很简单做个录音机,还搞的我心力交瘁,ALSA,伤啊… …
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/1105
吵吵微信朋友圈,请付款实名加入:
看到代码就头痛
第一次用linux的程序就是你的那款港湾登录器,到现在还不知道那些命令是干嘛用的…
如此技术,我说什么呢?
毕竟什么都是浮云