arecord和aplay命令

-- 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

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,在命令行录音的时候使用,可以看到一个由#符号组成的横向的实时音量显示。

aplay

播放。它跟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 --