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

Big*_*non 16 audio 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) 将接收器的声音重定向到源 ?

谢谢。

Big*_*non 11

找到了另一种方法:module-pipe-source。

pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1
Run Code Online (Sandbox Code Playgroud)

然后:

ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic
Run Code Online (Sandbox Code Playgroud)

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


小智 9

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

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

pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone
Run Code Online (Sandbox Code Playgroud)

创建接收应用程序音频并将其发送到我们的扬声器和我们刚刚创建的特殊混合接收器的接收器(替换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
Run Code Online (Sandbox Code Playgroud)

将我们的实际麦克风环回到我们的混音接收器(替换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
Run Code Online (Sandbox Code Playgroud)

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

pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel
Run Code Online (Sandbox Code Playgroud)

最后,我们创建回声消除源,作为 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
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,您还可以通过更改pavucontrol.

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


Chr*_*ham 9

我只想将 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
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

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

如果我必须教另一门课:

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

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