snd-aloop为linux kernel下的一个模块,使之生效需要加载对应的内核模块。
bash
sudo modprobe snd-aloop
上述命令执行后就会在linux下创建Loopback虚拟声卡,会在一个新的Loopback虚拟声卡上创建device 0和device 1,可用于playback和record,实现playback和record的回环,如果device 0用于playback,则device 1用于record;反之,如果device 1用于playback则device 0用于record。
但是用以上这种加载方式必须在每次系统重启后输入命令,可以修改配置文件,一劳永逸。
在/etc/modules-load.d/modules.conf中添加snd-aloop即可,重启后会自动加载aloop声卡。
然后通过aplay -l可以看到,playback的声卡,有两个loopback声卡。
arecord -l 可以看到record的声卡
有时可能需要在aplay或者arecord命令前加入sudo才可以,这是因为当前用户没有加入到audio组中,用以下命令重启后即可。
bash
sudo usermod -a -G 组名 用户名
有时我们可能需要把物理声卡删除,只保留aloop虚拟声卡,可以通过下述方式实现:
- cat /proc/asound/cards,可以看到当前有三个声卡,如下:
- 执行命令
bash
echo 1 | sudo tee /sys/class/sound/card1/device/remove
echo 1 | sudo tee /sys/class/sound/card2/device/remove
- 然后再通过cat /proc/asound/cards查看,可以看到确实只剩下Loopback声卡了。
可以使用echo 1 | sudo tee /sys/bus/pci/rescan恢复。
以上这种卸载声卡的方式存在两个问题:
- 系统重启后又恢复了,我们可能不想每次系统重启后,都手动操作,更希望自动删除。
- 如果我们想保留的card2,用上述方式删除后,card0和card1不存在,只有card2,但是在当前情况下card的序号应该从0开始。
可以在 /etc/modprobe.d/blacklist.conf添加黑名单,添加不需要加载的modules。但是我们怎么知道对应声卡的modules名称。
执行lsmod | less | grep "snd",可以看到声卡对应加载的模块
需要禁用的为红色框的module,在/etc/modprobe.d/blacklist.conf中添加
重启后,就会只保留aloop声卡。
以上是一些准备工作,现在看如何aplay,arecord回环,打开两个shell,在其中一个输入
bash
aplay -D hw:0,1 test.wav
在另一个shell输入
bash
arecord -D hw:0,0 -f S16_LE -c 2 -r 44100 recorded.wav
如此就recorded.wav实际为test.wav的一个回环,需要注意以下几点:
●以上参数中没有加subdevice,不加的话默认的subdevice为0
●需要保证arecord中的命令参数中的format和loopback的format一致,如果loopback的采样率为44100Hz,这里设置48000Hz,或者channel和sample_format不一致,保存的wav文件播放是按照你设定的参数来的,但是里面的PCM数据为实际声卡的参数。
以上的这种方式有一个问题,即如果test.wav的采样率为48000Hz,则回环后生成recorded.wav里面的pcm数据实际为48000Hz,但是参数配置为44100Hz,所以必须参数一致,我们可以用alsaloop工具实现音频流的重定向。
假设电脑有自己的物理声卡,我们也加载了虚拟声卡
在一个shell中输入
bash
alsaloop -C hw:2,1,4 -P hw:1,0
另一个shell中输入
bash
aplay -D hw:2,0,4 audio.wav
这样就会听到audio.wav的内容。具体的流程如下:
●audio.wav播放到loopback声卡,card 2 device 0,subdevice 4,
●由于虚拟声卡回环,播放流会回环到 card 2 device 1 subdevice 4
●我们用alsaloop采集card 2 device 1 subdevice 4的流,并重定向到card 1 device 0,subdevice 0.card 1为电脑的物理声卡,我们就会听到audio.wav了。
参考
https://sysplay.in/blog/linux/2019/06/playing-with-alsa-loopback-devices/
If you get gains,please give a like