如何创建一个新的 pipewire 虚拟设备,将实际输入和输出组合成一个新的输入?

如何创建一个新的 pipewire 虚拟设备,将实际输入和输出组合成一个新的输入?

我的问题是:我正在通过语音聊天与一些朋友交谈,有时我还想在其中混入一些音乐。所以我当前的设置是这样的:

Microphone (Input device) -> Voice software
Music player -> Headphones (Output device)

我想要这个:

Music player -> Headphones

Music player -\
               -> ? -> Voice software
Microphone   -/

我看过了Pipewire 维基百科相当多,尤其是关于虚拟设备似乎非常相关,但在玩了很多之后pw-loopback我最终放弃了。

最后,我认为我需要一个虚拟输入设备,以便可以在我的录音应用程序中选择它。

这是正确的方法吗?

答案1

如果您想混合语音输入(麦克风)和音乐播放器的输出,那么设置将如下:

Music player -\
               -> Combined Sink/Source -> Virtual Microphone -> Voice software
Microphone   -/

以下是演练:

1. 创建组合接收器接口

pactl load-module module-null-sink media.class=Audio/Sink sink_name=my-combined-sink channel_map=stereo

2. 创建虚拟麦克风

pactl load-module module-null-sink media.class=Audio/Source/Virtual sink_name=my-virtualmic channel_map=front-left,front-right

3. 将麦克风和音乐播放器输出连接到组合接收器

注意:麦克风接口名称和音乐播放器输出接口名称可能不同。运行pw-link -o以显示输出列表。

pw-link spotify:output_FL my-combined-sink:playback_FL
pw-link spotify:output_FR my-combined-sink:playback_FR

pw-link alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FL  my-combined-sink:playback_FL
pw-link alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FR  my-combined-sink:playback_FR

4. 将组合式水槽连接至虚拟麦克风

pw-link my-combined-sink:monitor_FL my-virtualmic:input_FL
pw-link my-combined-sink:monitor_FR my-virtualmic:input_FR

现在您可以告诉语音软件使用这个虚拟麦克风或者将虚拟麦克风设置为默认语音输入。

答案2

使用 pw-link 连接东西(查看“pw-link -h”)。另一种 GUI 方式是使用 Carla。还有专为 Pipewire 创建的 Helvum GUI

答案3

这是 Pujianto 给出的答案的脚本版本。这将创建一个与另一个应用程序组合的虚拟麦克风(假定该应用程序输出立体声、具有唯一名称且可 grepp)。

例如combine_audio.sh spotify

该脚本还将删除任何处于活动状态的空接收器,因此请注意,但我认为这在正常使用中并不常见?我将其与 Skype 和 OBS 一起使用,这样我就可以与人们聊天并流式传输应用程序/游戏音频以及我的麦克风,而无需循环播放他们的音频。您可能需要重新启动才能显示麦克风,但一旦它出现在那里,您就可以毫无问题地热插拔应用程序。

您还需要检查麦克风的名称,例如下面的脚本使用我的网络摄像头。

#!/bin/bash

SINK_NAME=combined-app-sink
VIRTUAL_MIC_NAME=my-virtualmic
MIC_SOURCE=alsa_input.usb-046d_Logitech_StreamCam_901DCE45-02.analog-stereo

results=$(pw-link -o | grep ${1})
IFS=$'\n' read -ra ADDR -d $'\0' <<< "$results"

# Unload if exists
pactl unload-module module-null-sink

# Make new sinks
pactl load-module module-null-sink media.class=Audio/Sink sink_name=$SINK_NAME channel_map=stereo >> /dev/null
pactl load-module module-null-sink media.class=Audio/Source/Virtual sink_name=$VIRTUAL_MIC_NAME channel_map=front-left,front-right >> /dev/null

# Extract app name
IFS=':'
read -a APP_STR <<< ${ADDR[0]}
echo "Linking app ${APP_STR} to ${SINK_NAME}"
pw-link "${APP_STR}":output_FL $SINK_NAME:playback_FL
pw-link "${APP_STR}":output_FR $SINK_NAME:playback_FR

echo "Linking $MIC_SOURCE to ${SINK_NAME}"
pw-link $MIC_SOURCE:capture_FL  $SINK_NAME:playback_FL
pw-link $MIC_SOURCE:capture_FR  $SINK_NAME:playback_FR

echo "Creating virtual mic: $VIRTUAL_MIC_NAME"
pw-link $SINK_NAME:monitor_FL $VIRTUAL_MIC_NAME:input_FL
pw-link $SINK_NAME:monitor_FR $VIRTUAL_MIC_NAME:input_FR

可以结合https://askubuntu.com/questions/355082/pulseaudio-loopback-unload-audio-output-devices使卸货更加智能化。

相关内容