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

相关推荐
我的K840939 分钟前
Flink整合Hudi及使用
linux·服务器·flink
1900431 小时前
linux6:常见命令介绍
linux·运维·服务器
Camellia-Echo1 小时前
【Linux从青铜到王者】Linux进程间通信(一)——待完善
linux·运维·服务器
Linux运维日记1 小时前
k8s1.31版本最新版本集群使用容器镜像仓库Harbor
linux·docker·云原生·容器·kubernetes
我是唐青枫1 小时前
Linux dnf 包管理工具使用教程
linux·运维·服务器
编程修仙2 小时前
Collections工具类
linux·windows·python
芝麻团坚果3 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
写点什么啦3 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
wellnw3 小时前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱3 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统