我想要一个可以录制我的麦克风的 Flash 应用程序(例如https://online-voice-recorder.com/)录制脉冲音频源。
我猜想,该闪存使用 ALSA。因此,我安装了 Alsa 循环设备sudo modprobe snd-aloop
,它整齐地显示在pavucontrol
和 中alplay -l
(在列表末尾):
adam@adam-g551jm:~ 130 $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: PCH [HDA Intel PCH], device 0: ALC668 Analog [ALC668 Analog] Subdevices: 0/1 Subdevice #0: subdevice #0 card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM] Subdevices: 7/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7 card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7
不幸的是,flash 插件根本看不到声音 - 就好像我正在录制零一样。
Flash 插件可以看到所有面向 ALSA 的声源:
- 为什么 Flash 插件看不到声音?
- 如何将 Pulse Audio 的输出路由到 ALSA 输入?
答案1
简单的答案在最后。但为了帮助理解解决方案,我会尽量讲得通俗易懂。我的假设:“环回设备”是卡 #2、设备 #0 和 #1,因此在所有示例中这都是正确的(例如,/dev/snd/pcmC2D0p
表示“卡 2、设备 0、播放”)。您的安装可能会有所不同,因此请修改相应的值。
首先,我创建/修改/etc/modprobe.d/alsa-aloop.conf
为只有一张卡且只有一个子流(只是为了简单起见):
user@desk:~$ cat /etc/modprobe.d/alsa-aloop.conf
options snd-aloop index=2 pcm_substreams=1 id=Loopback
之后sudo modprobe snd_aloop
,aplay -l
并arecord -l
显示
user@desk:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
.
.
card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
user@desk:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
现在,有一个问题:环回卡的两个设备都是播放设备,也是录制设备。但其功能snd_aloop
是将设备 0 中的输入路由到设备 1 中的输出,反之亦然(参见例如https://www.alsa-project.org/main/index.php/Matrix:Module-aloop)您可以在/proc/asound
目录中看到这些内容:
user@desk:~$ ls /proc/asound/card2
cable#0 cable#1 id pcm0c pcm0p pcm1c pcm1p
其中“pcm0c”是捕获设备 0,“pcm0p”是播放设备 0 等等。
因此pavucontrol
显示(并选择)两个循环设备,一个播放(hw:2,0)和一个记录(hw:2,1):
您无法在 中选择播放设备pavucontrol
,因此它选择设备 0:
查看播放设备文件时您将看到以下内容:
user@desk:~$ lsof | grep /dev/snd/pcmC2
pulseaudi 3314 user mem CHR 116,13 556 /dev/snd/pcmC2D0p
pulseaudi 3314 user 48u CHR 116,13 0t0 556 /dev/snd/pcmC2D0p
alsa-sink 3314 3320 user mem CHR 116,13 556 /dev/snd/pcmC2D0p
alsa-sink 3314 3320 user 48u CHR 116,13 0t0 556 /dev/snd/pcmC2D0p
.
.
所以这意味着必须通过以下方式捕获该音频流/dev/snd/pcmC2D1c
;如果您选择loopback
作为 Flash 的输入设备,它将使用/dev/snd/pcmC2D0c
(plugin-co
意味着 Flash 正在其中运行插件容器):
user@desk:~$ lsof | grep /dev/snd/pcmC2
pulseaudi 3314 user mem CHR 116,13 556 /dev/snd/pcmC2D0p
pulseaudi 3314 user 48u CHR 116,13 0t0 556 /dev/snd/pcmC2D0p
.
.
plugin-co 5093 user mem CHR 116,14 557 /dev/snd/pcmC2D0c
plugin-co 5093 user 21u CHR 116,14 0t0 557 /dev/snd/pcmC2D0c
.
.
您可以在明确播放声音时进行检查/dev/snd/pcmC2D1p
,例如使用
user@desk:~$ aplay -D hw:2,1 test1.wav
Playing WAVE 'test1.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
现在 Flash 插件可以录制声音了,你可以看到区别:
user@desk:~$ lsof | grep pcmC2
.
.
aplay 7256 user mem CHR 116,15 558 /dev/snd/pcmC2D1p
aplay 7256 user 4u CHR 116,15 0t0 558 /dev/snd/pcmC2D1p
.
.
plugin-co 7237 user mem CHR 116,14 557 /dev/snd/pcmC2D0c
plugin-co 7237 user 21u CHR 116,14 0t0 557 /dev/snd/pcmC2D0c
.
.
所以,现在的任务是:如何让 pulseaudio 选择环回卡的设备 #1 进行播放?
假设上面的值,你可以修改/etc/pulse/default.pa
为
.
.
### Load audio drivers statically
### (it's probably better to not load these drivers manually, but instead
### use module-udev-detect -- see below -- for doing this automatically)
#load-module module-alsa-sink
#load-module module-alsa-source device=hw:1,0
.
.
load-module module-alsa-sink device=hw:2,1
.
.
确保定义静态驱动程序前动态的。现在重启 PA ( pulseaudio -k
) 后,loopback
PA 的输出将转到卡 2,设备 1 ( device=hw:2,1
)。验证方法如下:
user@desk:~$ lsof | grep pcmC2
pulseaudi 8584 user mem CHR 116,15 558 /dev/snd/pcmC2D1p
pulseaudi 8584 user 18u CHR 116,15 0t0 558 /dev/snd/pcmC2D1p
alsa-sink 8584 8585 user mem CHR 116,15 558 /dev/snd/pcmC2D1p
alsa-sink 8584 8585 user 18u CHR 116,15 0t0 558 /dev/snd/pcmC2D1p
.
.
因此,您的 Flash 录音机就可以从 pulseaudio 的输出中进行录音。
备注:如果您不想编辑/etc/pulse/default.pa
,您可以使用 以交互方式加载模块pacmd load-module module-alsa-sink device=hw:2,1
。这将为您提供第二个loopback
设备pavucontrol
。如果您只想要一个环回设备,请先卸载相应的模块:
user@desk:~$ pacmd list-modules
.
.
index: 7
name: <module-alsa-card>
argument: <device_id="2" name="platform-snd_aloop.0" card_name="alsa_card.platform-snd_aloop.0" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
used: 0
load once: no
properties:
module.author = "Lennart Poettering"
module.description = "ALSA Card"
module.version = "8.0"
查找索引device-id=2
(此处为:7),然后卸载模块(pacmd unload-module 7
),之后加载回送接收器(pacmd load-module module-alsa-sink device=hw:2,1
)。