如何在 PulseAudio 中创建虚拟输出?

Naf*_*Kay 27 pulseaudio

我需要在 PulseAudio 中创建一个虚拟输出,以便能够从特定源捕获和流式传输音频。

我知道可以像这样将特定应用程序的输出重新路由到给定的输出设备,使用pavucontrol

我正在寻找向“输出设备”添加另一个虚拟输出:

这可能吗,如果可以,我该怎么做?

小智 30

您可以添加一个接收器

pacmd load-module module-null-sink sink_name=MySink
pacmd update-sink-proplist MySink device.description=MySink
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令添加环回设备

pacmd load-module module-loopback sink=MySink
Run Code Online (Sandbox Code Playgroud)

  • 对于输入,似乎还有一个“pacmd load-module module-null-source”,尽管它的输入电平读数会出现峰值。 (2认同)

Naf*_*Kay 15

sudo modprobe snd_aloop
Run Code Online (Sandbox Code Playgroud)

将环回设备添加到 ALSA,它出现在 PulseAudio 音量控制中。将您的流重定向到那里,然后快速!

不确定如何添加多个环回设备。


小智 8

对@mxc 的回答的一点补充,正如他所说,您可以使用 module-null-sink 作为虚拟输出:

    pacmd load-module module-null-sink sink_name=MySink
Run Code Online (Sandbox Code Playgroud)

这将创建一个可用于应用程序的新接收器(“虚拟输出”)。对于您创建的每个接收器,pulseaudio 还将创建一个监听源,因此除了您的 MySink 输出设备之外,您还将拥有一个 MySink.monitor 输入设备,您可以使用它来捕获发送到虚拟输出的内容。

通过这种方式,可以轻松捕获、重新流式传输或录制应用程序输出的音频。

这是一个纯粹的 Pulseaudio 解决方案,不需要 Alsa,因此它也可以使用与 Alsa 不同的后端来处理 Pulseaudio。


小智 7

除了创建接收器之外,大多数应用程序还会过滤掉监视源。为了能够直接选择源(例如在 Google Meet 中), module-remap-source 会有所帮助。

# create sink
pactl load-module module-null-sink sink_name=virtmic \
    sink_properties=device.description=Virtual_Microphone_Sink
# remap the monitor to a new source
pactl load-module module-remap-source \
    master=virtmic.monitor source_name=virtmic \
    source_properties=device.description=Virtual_Microphone
Run Code Online (Sandbox Code Playgroud)

(从https://aweirdimagination.net/2020/07/19/virtual-microphone-using-gstreamer-and-pulseaudio/找到这个)

另一种可能性是创建一个~/.config/pulse/default.pa 包含以下内容的文件:

.include /etc/pulse/default.pa

load-module module-null-sink sink_name=virtmic sink_properties=device.description=Virtual_Microphone_Sink
load-module module-remap-source master=virtmic.monitor source_name=virtmic source_properties=device.description=Virtual_Microphone
Run Code Online (Sandbox Code Playgroud)

运行pulseaudio -k以重新加载配置

您可以使用pavucontrol将音频从任何应用程序(如 Spotify)路由到虚拟麦克风接收器。


jbr*_*ock 5

我永远无法snd_aloop在我的系统上工作。此外使用ffmpeg -f pulse -i alsa_output.pci-0000_00_1f.3.analog-stereo.monitor etc.导致系统录音有1-2秒的延迟。mxc 的答案帮助我找到了解决方案,但我想添加一些信息。

我首先需要将内置音频的脉冲监视器设置为默认值。然后我运行上面列出的命令。我希望每次都将其设置为我的个人资料中的默认设置,因此我创建~/.config/pulse/default.pa并添加了以下行:

.include /etc/pulse/default.pa

set-default-source alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
load-module module-null-sink sink_name=MySink
update-sink-proplist MySink device.description=MySink
load-module module-loopback sink=MySink
Run Code Online (Sandbox Code Playgroud)

第一行包括系统范围的 PulseAudio 设置。然后,最后四行对于用户来说优先于任何系统设置。当然,当前面带有 时,最后四行中的任何一行都可以在终端中运行pacmd

要获取内置音频设备的脉冲监视器的名称,请运行:

pacmd list-sources | awk '/index:/ {print $0}; /name:/ {print $0}; /device\.description/ {print $0}'