Aloop虚拟声卡

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

相关推荐
Creeper_exe13 分钟前
RHCE http作业
linux·http
Johny_Zhao1 小时前
Centos7系统docker部署Ferry工单系统
linux·工单系统·ferry
ITenderL2 小时前
Linux常用命令总结
linux·常用命令
Ljw...2 小时前
进程信号
linux·进程信号
昨天今天明天好多天2 小时前
【Linux】Kafka部署
linux·运维·kafka
梅秃头2 小时前
CentOS 8修改Linux配置文件指定属性的值
linux·运维·服务器
一个小坑货2 小时前
CentOS9 Stream上安装Edge浏览器
linux·centos
我是如子啊2 小时前
【UBuntu20 配置usb网卡】 记录Ubuntu20配置usb网卡(特别是建立热点)
linux·网卡·教程·ubuntu20.04·wifi热点·ap·usb网卡
sdau_blue2 小时前
pycharm远程服务器Linux下解决cannot connect to X server问题
linux·运维·服务器
CP-DD2 小时前
linux 高级 I/O
linux