有时我想通过 Skype、Discord 等与朋友分享音乐。
我不想分享我的声卡的全部输出(我可以通过将相应的监视器设置为麦克风来做到这一点),因为这样我的朋友可以听到他们自己的声音(这很烦人),而且可能还有其他声音在播放我也不希望他们听到的音乐(例如通知)。此外,当我这样做时,我不再能够在通话中说话(因为我的麦克风设置为其他东西)。
如何将某些应用程序的输出声音与麦克风的声音混合,并通过语音聊天发送该信号?
我正在使用 Linux Mint。
有时我想通过 Skype、Discord 等与朋友分享音乐。
我不想分享我的声卡的全部输出(我可以通过将相应的监视器设置为麦克风来做到这一点),因为这样我的朋友可以听到他们自己的声音(这很烦人),而且可能还有其他声音在播放我也不希望他们听到的音乐(例如通知)。此外,当我这样做时,我不再能够在通话中说话(因为我的麦克风设置为其他东西)。
如何将某些应用程序的输出声音与麦克风的声音混合,并通过语音聊天发送该信号?
我正在使用 Linux Mint。
(下面我将假设使用类似 Ubuntu 的 Linux 发行版 --- 在我的情况下,我使用的是 Linux Mint 20.1 Cinnamon --- 并且安装了 Pulse Audio Volume Control;您可以使用
sudo apt install pavucontrol
.对于任何 Linux 发行版,如果你没有做一些太奇怪的事情,但我不保证。我还想出了以下内容,因此对任何不准确之处深表歉意。)首先,让我回顾一下 Pulse Audio 相关的一些概念,这将使下面的解释更容易理解:
接收器是“消耗”音频信号的东西(可能将该信号转换为类似实际声音的东西)。例如,这意味着您的扬声器是一个水槽。您也可以将它们称为输出设备。
源是相反的概念;它是产生信号的东西,例如麦克风。您也可以将它们称为输入设备。
监视器是为计算机上的每个输出设备(接收器)创建的虚构(虚拟)输入设备(源)。它只是复制相应源上输出的声音,就好像它进入计算机一样。
您还应该知道,在使用 Pulse Audio 时,有三个主要工具:
Pulse Audio Volume Control
GUI 界面,您可以从终端开始使用pavucontrol
、pactl
命令和pacmd
命令。该命令的大部分功能(我们感兴趣的)
pactl
都是通过内置的“模块”实现的。您可以调用这些模块并用
对此所做的更改不是永久性的。在恐慌中退出并重新登录,您应该能够重新开始。
pactl
的反馈也很差——只要你的命令有问题,它就会半静默地失败,并显示“失败:模块初始化失败”——但你可以在这里找到一个很好的文档参考。好的,因此,以下是我们可用的成分和游戏计划:
我们可以创建所谓的“空汇”。这些是能够像扬声器一样接收信号但不播放声音的虚拟接收设备。这些是使用
module-null-sink
模块创建的。我们可以将声音从源“环回”回接收器。将其视为转发,例如,从麦克风直接进入扬声器的声音。这是通过
module-loopback
模块实现的。我们可以使用
pavucontrol
界面选择将每个应用程序的声音播放到哪个接收器中;只要有多个接收器,您就可以在“播放”选项卡中为每个应用程序选择要使用的接收器。那么,计划如下:
找出我们声卡的源(内置麦克风)和接收器(扬声器/耳机)
创建一个
transmit
接收我们要广播的应用程序声音的空接收器设备 ( )将声音从
transmit
我们的声卡环回,这样我们也可以听到我们正在广播的内容(因为请记住,空接收器只会丢弃它们接收到的内容)创建另一个接收麦克风声音和声音的空接收器设备 (
combined
) --- 这是我们想要广播的信号,但不是我们想要听到的信号,因为我们不想听到自己说话transmit
在 Skype 通话中使用显示器
combined
作为我们的虚拟麦克风以便将计划付诸实施:
0. 找出我们的内置接收器/源
pactl
让我们轻松枚举我们的接收器/源:告诉我们一个水槽
这是我的声卡的输出,即笔记本电脑的扬声器或耳机,我们可以找到源
产生
我在我的电脑上设置了两个源:
alsa_input.pci-0000_00_1f.3.analog-stereo
一个是我的内置麦克风(来自声卡),alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
另一个是接收器的监视器alsa_output.pci-0000_00_1f.3.analog-stereo
,即从我的扬声器或耳机中发出的声音就好像它来了进入电脑。1.创建
transmit
水槽这很简单
module-null-sink
:请注意,我们已将这个新接收器命名为
transmit
,但如果您查看pavucontrol
,在输出设备选项卡下,您会发现确实有一个新设备,但它被称为“空输出”。这是因为pavucontrol
将设备的描述显示为显示名称;如果我们再次枚举我们的接收器......我们可以看到 sink 确实被调用
transmit
了,但是它的device.description
属性是“Null Output”。我们可以解决这个问题pacmd
:(如果您收到“无法解析 proplist。”,请注意单引号。)
当我们创建我们的 null sink
transmit
时,相应的监视器源 ,transmit.monitor
也被创建了。(您可以通过pactl list sources
再次调用来检查。)我们也应该修复它的名称,我们可以再次使用pacmd
:现在,如果您播放一些音乐,例如,您将能够将该信号转发到 Playback 标签下的新接收器
pavucontrol
。但是,该信号不再可听到,因为它正在播放到空接收器;让我们解决这个问题。2. 回送声音
transmit
回想一下,当发送到(在我的情况下)接收器 0 时,扬声器/耳机会播放声音
alsa_output.pci-0000_00_1f.3.analog-stereo
。然后,如果我们将进入 sink 的声音回transmit
传到这个 sink,我们应该能够再次听到它。当然,我们不能从接收器环回信号,信号必须来自源。幸运的是,监视器正是进入接收器的信号,呈现为源。然后让我们环回
transmit.monitor
我们的声卡,使用module-loopback
:您现在应该能够再次听到发送到“要传输的信号”接收器的声音。
3.结合
transmit
和麦克风现在的程序与第 1 点和第 2 点非常相似;我们将创建另一个接收
transmit.monitor
信号和麦克风输入的空接收器。该信号的监视器将用作要使用的虚拟麦克风。我们首先创建空接收器
combined
......并修复出现在
pavucontrol
...中的默认名称...最后将我们的麦克风和
transmit
监视器环回组合通道:4. 利润
现在,在设置通话时,应该可以使用名为“Transmit+Microphone”的麦克风 --- 这是您选择的声音和您的声音的组合信号。
请注意,所有这些环回等可能会产生 CPU 开销,但我的笔记本电脑根本不是很强大,除了一些延迟之外我没有任何问题。要撤消上述所有操作,请致电
或注销并重新打开。
TL;博士
如果这对您来说失败了,请阅读该帖子,但
alsa_input.pci-0000_00_1f.3.analog-stereo
对您来说可能会有所不同。