-- TOC --
Linux基本使用ALSA(Advanced Linux Sound Architecture)语音系统,arecord和aplay这两个命令就来自alsa-utils。
Ubuntu和Fedora都自带这套语音工具,没有的话,安装也很简单:
$ sudo apt install alsa-utils
$ sudo dnf install alsa-utils
如果是要开发:
$ sudo apt install libasound2-dev
$ sudo dnf install alsa-lib-devel
$ gcc ...... -lasound
与音频有关的基础知识:
arecord命令用来录音,输出wave格式的数据,或者raw格式。
我测试过arecord并发工作的情况,多个arecord进程同时录音,是OK的。
有一些设备,不接麦克风,也可以正常录音,比如笔记本电脑,对着喊就是了......在虚拟机里测试,不接麦克风也能录音。也许不接麦克风可以录音是个常识。没有声音,只需插上MIC。
查看系统所有record设备:
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC233 Analog [ALC233 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
-t
,指定输出数据格式,默认是wave格式,还支持raw,voc,au,后两种格式不懂。
-D
,指定record设备,设备名的格式为hw:0,0
,表示0号card的0号device。
-c
,指定channel数,默认是mono,即one channel,最大可以到32。但实际上,如果只有一个麦克风,就只能录制mono音轨。
-f
,指定语音数据格式,有很多格式可以选择,具体参考manpage。
-r
,指定采样频率。
-d
,指定录音的时长。
数据格式和采样率决定了语音数据的质量。
从采集语音数据到通过中断通知驱动并copy数据到系统,这一段延迟叫做input delay
,arecord命令有几个参数可以用来控制这个delay,默认的delay是比较明显的。下面的参数比较好用一些:
--period-size
,指定底层每多少个frame中断一次。
我测试发现无论如何降低设置,最低的frame中断数据是128。底层每次中断,就会把数据传递给系统,然后通过系统调用read,就可以获得一些数据。
-vv
,在命令行录音的时候使用,可以看到一个由#
符号组成的横向的实时音量显示。
播放。它跟ffplay有点类似,如果是播放raw数据,由于数据文件本身没有任何meta信息,因此需要在命令行指定这些数据。
当aplay播放raw数据的时候,自动双声道。
查看所有play设备:
$ aplay -l
aplay的命令行参数与arecord一样,它们共享同一个manpage。
-B
,这个参数会影响播放时的output delay,但不能把它设置为0。
下面这行命令是可以工作的:
$ arecord | aplay
用上面的命令,你就能感知到默认情况的input delay,感觉大概半秒多钟。如果这样:
$ arecord --period-size 128 | aplay -B 10
就几乎感觉不到延迟。以上两种情况,区别非常明显。
查看系统语音设备:
$ cat /proc/asound/cards
$ ll /dev/snd
本文链接:https://cs.pynote.net/sf/linux/shell/202207131/
-- EOF --
-- MORE --