将 Pulseaudio 接收器重定向到虚拟源

将 Pulseaudio 接收器重定向到虚拟源

我正在尝试将程序(在我的例子中为 ffmpeg)的声音重定向到源,以便我可以在 Zoom(视频会议软件)中播放有问题的声音。执行此操作的经典方法是选择 SinkName.monitor 源作为 Zoom 中的声源,因为每个接收器都配有监视器。但 :

1) Zoom 未在其麦克风下拉列表中列出监听源。我尝试将显示器的 device.class 属性设置为“声音”(而不是“显示器”)来欺骗 Zoom 接受它,但无济于事。

2)Zoom似乎拒绝让你从pavucontrol自己设置源。在“录制”选项卡中,当我尝试为自己设置另一个由 Zoom 收听的源时,无论我选择什么,我的选择都会被忽略。下拉选项甚至没有改变。我在某处读到创建 ~/.alsoftrc 并编写“[pulse]”(新行)“allow-moves=yes”可能有帮助,但它对我没有任何作用。

因此,我尝试设置自己的源,并“将声音重定向到它”。我创建了一个空接收器、一个空源和一个环回,但是在打开 pavucontrol 后,我明白我可能把它弄反了;环回似乎用于将源重定向到接收器,而不是相反(pavucontrol 在播放下说:“[...] MySink 上的 MySource 的环回”,MySink 是右侧下拉列表的值)。

有办法实现我想做的事情吗?任何一个:

a) 修改监视器,使其看起来像普通麦克风,或者

b) 将接收器的声音重定向到源?

谢谢。

答案1

以下设置适用于我在 Linux 上与 Zoom 共享应用程序音频。按原样设置,将麦克风和应用程序音频输入 Zoom。但是,正如最后所述,也可以将其更改为仅使用两者中的任何一个。

创建一个接收器,我们将在其中混合麦克风和一些应用程序音频:

pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone

创建一个接收器,它接收应用程序音频并将其发送到我们的扬声器和我们刚刚创建的特殊混合接收器(替换alsa_output….analog-stereo为您的接收器的名称,请参阅pactl list sinks short。)

pactl load-module module-combine-sink sink_name=virtual-microphone-and-speakers \
slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo

将我们的实际麦克风环回至我们的混音接收器(alsa_input…analog-stereo用您的源名称替换,请参阅pactl list sources short。)

pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo \
sink=mix-for-virtual-mic latency_msec=20

我不清楚 Zoom 如何确定什么是麦克风。我们不能告诉它使用监视器,但它会监听echo-cancel(如 Paul 所描述的)。由于没有我们实际上想要取消的回声,我们创建一个假接收器来取消:

pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel

最后,我们创建回声消除源,它将用作 Zoom 检测到的麦克风:

pactl load-module module-echo-cancel \
sink_name=virtual-microphone source_name=virtual-microphone \
source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null \
source_properties=device.description=Virtual-Microphone \
sink_properties=device.description=Virtual-Microphone

现在,Zoom 应该在麦克风部分显示一个虚拟麦克风。

要将应用程序音频发送到虚拟麦克风,请在 中将pavucontrol应用程序的接收器设置为 Mix-for-Virtual-Microphone(仅将其发送到虚拟麦克风)或“同时输出 Mix-for-Virtual-Microphone,...”将其发送到麦克风和扬声器。

请注意,您还可以通过更改 中“同时输出…”的音量,将虚拟麦克风和扬声器上的应用程序音频静音或更改音量,而与麦克风的实际音量无关pavucontrol

当然,您可以在“输入设备”部分将麦克风静音以仅共享应用程序音频。

为了更容易理解,以下是此设置的可视化:

设置图

答案2

找到了另一种方法:模块管道源。

pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1

然后:

ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic

(请注意,这也使用模块 v412loopback 伪造了一个网络摄像头)

答案3

我只想将 OBS 路由到 Zoom。我使用V4l2loopback连接视频(参见https://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/)。要连接音频,请执行以下操作:

#!/bin/sh

# This created something I could see in OBS.  Set it as the monitor device in Settings->Audio.  Then
# turn on monitoring for the microphone and the video.

pactl load-module module-null-sink sink_name=Virtual-Speaker sink_properties=device.description=Virtual-Speaker

# Now I need to take the monitor stream from the Virtual-Speaker and turn it into a source that Zoom can use
# as a microphone.

pactl load-module module-remap-source source_name=Remap-Source master=Virtual-Speaker.monitor

当从 OBS 播放视频时,音频/视频已对齐,如果您尝试在视频上添加评论,则视频无法正确同步。

更新:

使用它已经有一段时间了,这是我的流程:

  1. 启动计算机,
  2. 运行脚本,
  3. 启动 OBS(控制摄像机并启动虚拟视频输入),
  4. 开始缩放(抓取虚拟源,但有时会出现音频延迟),
  5. 退出OBS,
  6. 启动OBS(现在音频没有延迟)。
  7. 教课

如果我必须教另一门课:

  1. 退出缩放,
  2. 开始新的 Zoom 会议,
  3. 退出OBS,
  4. 启动OBS。
  5. 教二班

这个过程对我来说已经可靠了一段时间了。我没有尝试在该过程中添加任何额外的自动化。理论(没有实际证据):我必须在 ZOOM 之前启动 OBS,以便程序获取正确的设备。 OBS 开始将内容放入音频管道中,因此我必须停止并重新启动 OBS 以让管道刷新。

答案4

我在使用 Zoom 时也遇到了同样的问题。另一种选择可能是module-echo-cancel.这可以从现有的监视器源创建新的源。我相信使用默认设置,它几乎不会进行处理。

pactl load-module module-echo-cancel \
   sink_name="echo_cancel" \
   source_master="YourSink.monitor" \
   sink_master="DefaultSink" \
   aec_method="webrtc"

设置DefaultSink为默认输出设备和YourSink.monitor接收器的监视器(在我们的例子中为流接收器)。

我从这里得到了这个解决方案ipwebcam-gst 脚本

相关内容