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

相关推荐
H_oRIZoN_4 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
GeW5 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu6 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊6 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩6 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
笨笨饿7 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
m0_459872927 小时前
Linux 系统基础
linux·运维·服务器
吴声子夜歌7 小时前
Shell编程——数组
linux·运维·shell
blueSatchel8 小时前
ros-humble仿真-建图-导航
linux·ros2
Lucis__8 小时前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc