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

相关推荐
叠叠乐8 小时前
linux.service 自起文件want和After意思
linux
Ricky_Theseus8 小时前
SPOOLING 系统详解
linux·服务器·数据库
ulias2128 小时前
Linux中的基本命令符
linux·运维·服务器
江公望9 小时前
make modules_install和make install的区别
linux
HABuo9 小时前
【linux线程(二)】线程互斥、线程同步、条件变量详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
墨^O^9 小时前
进程与线程的核心区别及 Linux 启动全过程解析
linux·c++·笔记·学习
福楠9 小时前
现代C++ | C++14甜点特性
linux·c语言·开发语言·c++
Lugas Luo9 小时前
Kernel 5.10 针对 eMMC 的 Detect、Power、Add 及深度优化解析
linux·嵌入式硬件
charlie1145141919 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(4)从零构建 STM32 构建系统
linux·开发语言·c++·stm32·单片机·学习·嵌入式
刘瑜澄10 小时前
[邪修方法]ubuntu 25 wayland窗口协议下使用utools
linux·运维·ubuntu·wayland·utools