ALSA|ALSA 音频应用的开发
最近接到一个项目替换过去的摄像头上得Sensor声卡,原来的摄像头因为时间的推移不幸停产了,原本是非常简单的一个问题,结果被越高越大,主要是在跟换Sensor的时候碰到了几个问题一一列举如下:
等等啊,先说下ALSA到底怎么开发,传说中的alsa.conf到底是个啥,以及alsa-lib的版本问题。
ls -l /dev
ls -l /dev/snd
看看亲们的/dev/目录下有没有我们要的声卡设备,如果没有,哈哈亲们写驱动吧,这里不涉及驱动。
在alsa-1.0.14以前,pcmC0D0c,timer,Control这些东西是直接放在/dev目录下的,但是,可但是 alsa-1.0.15以后这些亲们去了/dev/snd/目录下面安家了,直接证明了,不只是中国有城管,Linux世界也有。
alsa-driver-1.0.14的时候也只会产生/dev/pcmC0D0c等文件,所有呢如果你用的alsa-1.0.15的话请手动移驾到/dev/snd目录 不然呵呵呵呵呵 aplay 无法识别到设备 纠结我1天整
mkdir -p /dev/sndln -s /dev/pcmC0D0c /dev/snd/pcmC0D0cln -s /dev/timer /dev/snd/timerln -s /dev/controlC0 /dev/snd/controlC0
我只有声卡,所以没有pcmC0D0p等文件
# cat /proc/asound/
/proc/asound/Camera//proc/asound/cards/proc/asound/hwdep/proc/asound/seq//proc/asound/version/proc/asound/card0//proc/asound/devices/proc/asound/pcm/proc/asound/timers
# cat /proc/asound/version Advanced Linux Sound Architecture Driver Version 1.0.14rc3 (Wed Mar 14 07:25:50 2007 UTC).
看下我最亲爱的驱动,心寒啊
# cat /proc/asound/devices0: [ 0]: control1:: sequencer 24: [ 0- 0]: digital audio capture 33:: timer
还好该在的都在hw:0,0 但是他也是default ..............现在我们证明有声卡的存在了就是为了这个,我累了好多天,tmd
好,我们的声卡既然存在那我们开始打开他吧
/* Open PCM device for recording (capture). */
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);
}
一般这就打开了,但是作为博主我没打开!!!!我换成hw:0,0 打开了 是不是很想知道我如何知道我应该在hw:0,0就能打开的呢???
alsa-utils 中的aplay -L 一定要小心这个是aplay是放音的测试工具 如果你喜欢最好用arecord这是录音的工具
# ./alsa-utils/bin/aplay -L | grep -v "^ "
default:CARD=Camera
front:CARD=Camera,DEV=0
surround40:CARD=Camera,DEV=0
surround41:CARD=Camera,DEV=0
surround50:CARD=Camera,DEV=0
surround51:CARD=Camera,DEV=0
surround71:CARD=Camera,DEV=0
iec958:CARD=Camera,DEV=0
null
# ./alsa-utils/bin/arecord -L| grep -v "^ "
null
看!!没有!哈哈,必然没有至于为啥我真的不知道,不过我问可以试一试
./alsa-utils/bin/arecord -l| grep -v "^ "
# ./arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Camera [USB 2.0 PC Camera], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0 device 0 ------> hw:0,0 好啦自此以后我们打开了那扇大门,然后我们干点啥呢?
配置她的参数,alsa着娘们真带劲
/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);
到这里我又失败了,失败了还有天理吗!!!!
当然在我年幼的时候我还不会有那个强大的alsa-utils 我自己写得程序,去测试,去读取 呜呜 软小啊
后来 我有必应!!!百度那屌丝级的搜索引擎!!google根本打不开 但是 必应来了!!!!!!
可是可但是悲剧持续着
# ./alsa/alsa-utils/bin/arecord -D hw:0,0
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
arecord: set_params:879: Broken configuration for this PCM: no configurations available
后来!有一天我发现不在去爱............. 默然回首我返现了
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
在这里,就在这里
# ./alsa/alsa-utils/bin/arecord -h
Usage: arecord [OPTION]... [FILE]...-h, --helphelp
--versionprint current version
-l, --list-deviceslist all soundcards and digital audio devices
-L, --list-pcmslist device names
-D, --device=NAMEselect PCM by name
-q, --quietquiet mode
-t, --file-type TYPEfile type (voc, wav, raw or au)
-c, --channels=#channels
-f, --format=FORMATsample format (case insensitive)
-r, --rate=#sample rate
-d, --duration=#interrupt after # seconds
-s, --sleep-min=#min ticks to sleep
-M, --mmapmmap stream
-N, --nonblocknonblocking mode
-F, --period-time=#distance between interrupts is # microseconds
-B, --buffer-time=#buffer duration is # microseconds
--period-size=#distance between interrupts is # frames
--buffer-size=#buffer duration is # frames
-A, --avail-min=#min available space for wakeup is # microseconds
-R, --start-delay=#delay for automatic PCM start is # microseconds
(relative to buffer size if <= 0)
-T, --stop-delay=#delay for automatic PCM stop is # microseconds from xrun
-v, --verboseshow PCM structure and setup (accumulative)
-I, --separate-channels one file for each channel
Recognized sample formats are: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM SPECIAL S24_3LE S24_3BE U24_3LE U24_3BE S20_3LE S20_3BE U20_3LE U20_3BE S18_3LE S18_3BE U18_3LE
Some of these may not be available on selected hardware
The availabled format shortcuts are:
-f cd (16 bit little endian, 44100, stereo)
-f cdr (16 bit big endian, 44100, stereo)
-f dat (16 bit little endian, 48000, stereo)
这里我找到了灵感! # ./alsa/alsa-utils/bin/arecord -D hw:0,0 -r 8000 -f S16_LE
剩下的挨个试吧,结果还是不行,我找到了厂家,求他们帮我把采样率改成8k 格式 小端的16位,然后我成功了
【ALSA|ALSA 音频应用的开发】
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 陇上秋二|陇上秋二 罗敷媚
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我们应该和什么样的人交朋友
- (七)谈条件
- 早知道你是只飞鸟,我就应该把你关起来
- 《老婆》
- 每天都应该是新的开始
- java之static、static|java之static、static final、final的区别与应用