在 Discord 上共享屏幕

背景

很早之前,我曾经写过一篇在 Mac 上用 Skype 来和朋友一起看电影的方法。主要的问题是 Mac 默认的音频输入和输出只有一个,这带来了一些二选一的问题。

  1. 只有一个输入源:麦克风和电脑的内放声音只能选择一个输入到 Skype,即朋友要么听到你的声音,要么听你电脑的声音。
  2. 只有一个输出源:如果把声音输入到 Skype 让朋友能听到声音,那么自己便听不到。

默认环境

现在回头看,当时的文章写的很凌乱,但还是在很长一段时间都贡献了我博客最大的流量(现在每天访问最多的是 iOS 后台播放 Youtube的文章……)。最近在 Discord 上有同样的二选一的问题,所以这里重新把解决方案更新并整理一下。文章的方法也可以灵活地用在其他录音环境中。

在 Mac 平台的 Discord 上,音频的输入默认只能选择麦克风,这导致你想通过共享屏幕来直播游戏或其他活动时,频道中的其他人无法听到电脑的声音。这次的的解决方案依然是免费的 soundflower(下载地址)。不用更强大的 Loopback 主要是出于以下原因:

  • Soundflower 简单但已经足够。
  • Loopback 的免费版本会降低音质。
  • 我没用过 Loopback。

注意 soundflower 目前不支持 M1 版本的 Mac。M1 版本 Mac 用户可使用 Blackhole 代替。(https://github.com/ExistentialAudio/BlackHole)

原理说明

我先来解释一下 Soundflower 能够做什么。 Soundflower可以生成两种虚拟的设备,一个叫做「多输出设备」(Multiple output devices),一个叫做「聚集设备」(Aggregate devices)。 也许你从名字就可以大概猜到它们的用途。我们把一个声音输出给「多输出设备」,它就可以把声音同时输出给多个设备(所以你的耳机和 Discord 都可以接收到声音),这样我们就可以解决本文开头的第二个问题。 而「聚集设备」是把多个输入源聚集起来,集中输入到一个地方去,这样就可以同时把麦克风和电脑的声音都塞给 Discord 或其他录音软件。

image.png

通用配置

好了,那我们来开始设置吧。在下载并安装 Soundflwoer 之后我们通过 Mac 的「音频midi设置」来进行设置。你可以在启动台的「其他」中找到它,也可以直接通过 Spotlight 来打开。

我们首先来添加一个多输出设备。 点击左下角的「+」,选择「创建多输出设备」。

image.png

选中刚刚创建的多输出设备之后,在右边的界面可以选择要把 Mac 的声音输出给谁。这里可以选自己喜欢的设备,比如你的耳机或者音箱,但一定要选中 soundflower(2ch)。

image.png

类似地,我们通过左下角的「+」来创建聚集设备,并在右边选中你的麦克风和soundflower(2ch)。

image.png

注意,通过聚合设备来同时输入内放声音和麦克风声音的做法在 Discord 中并不生效(但在其他录音软中依然可用)。针对 Discord 的方法可以参考最后的补充部分。

原理复习

Soundflower 的设置就完成了。我再解释一下这个设置到底发生了什么。 在输出端,我们通过「多输出设备」,把电脑播放的声音分成了两份,一份交给了耳机(或其他你选择的输出设备),另一份交给了 soundflower(2ch)。而在输入端,我们同时把麦克风的声音和 2ch 拿到的声音信号打包作为一个输入源。

接下来就可以根据需要灵活地使用了。最直接的办法是通过右上角的喇叭图标进入「声音偏好设置」,把输入设置为「聚集设备」,把输出设置为「多输出设备」,就可以达成我们刚才所描述的图景。[DEL]而 Discord 默认的音频输入输出与系统一致,应该已经生效了。如果有需要也可以单独在 Discord 中设置。[/DEL]

[DEL]设置完成后的效果是,通过 Discord 共享屏幕,其他人可以听到你的声音和你电脑正在播放的声音;你自己也可以正常听到电脑播放的声音。[/DEL]

需要说明的是,soundflower 不能为每个程序单独控制音频流向(loopback 可以)。 另外在使用虚拟的设备之后,不能直接调整系统的音量,可以通过正在使用的播放软件单独控制音量,或者先设置好合适的音量再切换到虚拟设备。

就这样,have fun。

针对 Discord 的补充内容

遗憾的是,实际测试之后我们会发现 Discord 并不能按照预想的方式工作。在输入为聚合设备的时候,Discord 仍然只能获取其中一个 channel 的声音信号(我的情况是只能使用 soundflower(2ch) 的信号,而麦克风的声音依然会被忽略),这似乎是 Discord 的一个限制。因此聚合设备只适用于其他录音软件。

那 Discord 要怎么办?目前有两个选择,第一是使用 Loopback,我就不介绍了。如果你不想买 Loopback,那可以考虑一下我下面的做法。

其实原理也很简单,既然 Discord 只能使用一个 channel,那我们只要把电脑内部的声音和麦克风的声音都输入给 soundflower(2ch),然后把 soundflower(2ch) 作为 Discord 的声音输入源就行了。

很久之前曾有一个免费的 LineIn 软件可以做到这点,但这个软件很久没有更新,在目前的 macOS 上已经无法使用,所以我们只能换个思路。如果电脑可以即时地把麦克风的声音播放出来,麦克风录入的声音就会作为电脑内放的声音被输入到 soundflower(2ch) 中,进而被 Disocrd 接收了。而这……不就是录音环境中的「监听」么?一个正常的录音软件应该都支持才对,听起来很可行。

事实上也确实可行,我之前误以为 Discord 可以用聚合设备就是因为在测试的时候无意打开了一个录音软件并且回放了麦克风的声音。macOS 自带的录制软件 QuickTime 就支持监听,但有两个问题:

  • QuickTime 的监听有一秒左右的延迟,这样会导致你在 Discord 和朋友聊天的时候体验很差。
  • QuickTime 只有声音输入源的设置,而没有输出的设置。导致的结果是你将一直听到自己的声音。

我们需要一个 Plan B。它需要支持麦克风声音的监听,监听的延迟要低,最好还是免费的。巧了,GarageBand 刚好就是这样一款免费(甚至是自带)的相对专业的录音软件。下面我完整来说一下一些关键的设置。

首先我们还是需要用到刚刚创建的多输出设备,来确保电脑的声音可以同时输入到耳机和 soundflower(2ch) 中去,因此我们需要在声音偏好设置中将系统的声音输出设置为「多输出设备」。

打开 GarageBand,新建一个空白项目,在轨道类型选择第二项「使用麦克风…音频文件」,并在输入中选择「输入1+2」。

image.png

image.png

image.png

在 库乐队->偏好设置->音频/MIDI 中,将输入设置为我们的麦克风(下图中的 iPad 就是我在用的麦克风),将输出设置为我们的「多输出设备」或者 soundflower(2ch)。如果选择「多输出设备」,由于GarageBand 会把麦克风的声音同时输出到耳机和 soundflower(2ch) 中,所以会有监听效果,即我们可以通过耳机听到自己的声音(放心,别人不会听到回声);如果只选择 soundflower(2ch),则没有监听效果。在 GarageBand 地主界面中,左边地监听按钮可以控制监听地开关,同时也可以方便地控制麦克风音量。在使用的过程中不需要开启录音,只要打开这个界面即可。你也可以将这个项目保存,在需要地时候直接打开即可。

最后只要在Discord 的音频设置中将输入设置为 soundflower(2ch) 就大功告成了,Have Fun!