用 Sunshine + Moonlight 打造带有“隐私模式”的游戏串流服务

本来我是没有串流玩游戏的习惯的。不过现在上大学了,宿舍是上下铺(不过上床下桌好像也会被看到电脑屏幕?);然后前两天《驱动妖精》发售嘛,我想玩但是感觉被舍友看到不太好;再加上我校 WiFi 正好 没有 AP 隔离;在这天时地利人和的环境之下,我就开始琢磨局域网游戏串流。

本来吧,现在成熟的局域网串流方案其实有很多,并不需要单独写一篇文章来讲。但是我的需求比较特殊——“隐私模式”,也就是商用远程控制软件通常都具备的这两项功能:

  • 开始串流时关闭宿主机显示器(做不到的话,那岂不是跟我坐在电脑前玩没区别?)
  • 停止串流时锁定宿主机操作系统(虽然目前看来舍友人都很好,但是防人之心不可无嘛)

具备这两项功能的游戏串流软件我反正是没找到。后来我在看 NVIDIA GameStream 的一个开源服务端实现 Sunshine 的文档的时候,意外地发现它有一个“Command Preparations”特性,允许在启动和退出串流的时候执行一系列命令,这便成了我自己实现“隐私模式”的突破口。

开始串流自动关屏

其实商用远程控制软件的这个功能并不是通过不输出画面来让显示器关闭的,毕竟如果不输出画面了的话,远程控制终端也是什么都看不见的。真正的实现方式其实是:模拟一个显示器,将 Windows 的多显示器设置设置为”仅第二显示器“,然后捕捉虚拟显示器上的画面串流给终端。这样的话,宿主机的主显示器就会因为无信号输入而关闭。

无论是服务器软件 Sunshine 还是客户端软件 Moonlight 自然都不提供这个功能,且在 Windows 上模拟显示器需要来自微软的驱动代码签名,我也没法。但是一个工具软件开发商 Amyuni 将自己的 USB Mobile Monitor 所使用的驱动程序免费公开,并提供了一个易于使用的命令行控制界面:https://www.amyuni.com/forum/viewtopic.php?t=3030。通过这个驱动程序,用户可以创建四个虚拟显示器,对于我的需求来说绰绰有余。

要使用这个驱动程序,首先下载包含驱动程序和控制软件的压缩包,解压后存放到特定位置,打开 Sunshine 的 Web 控制台,在“Configuration”标签页的“Command Preparations”一项的“Do Command”和“Undo Command”两栏中,分别输入启用和禁用虚拟显示器的命令 deviceinstaller64.exe enableidd 1deviceinstaller64.exe enableidd 0,然后勾选“Elevated”复选框让该命令以管理员身份运行(如果不配置 PATH 变量而是使用绝对路径,那么需要将 enableidd 0 参数放在括起绝对路径的引号外)。

在创建虚拟显示器后,还需要让 Windows 把画面输出到该显示器上,即将多显示器显示模式切换到“仅第二屏幕”模式。在搜索后我发现,按 Win + P 组合键弹出的“投影”弹窗实际上是 WinSxS 目录里的 DisplaySwitch.exe 程序,该程序本身也允许通过命令行开关或参数(有报告称 Windows 11 已不接受开关,仅可使用参数。但我的电脑则依然可用)来切换显示模式:

  • DisplaySwitch /internalDisplaySwitch 1:“仅电脑屏幕”模式
  • DisplaySwitch /cloneDisplaySwitch 2:“复制”模式
  • DisplaySwitch /extendDisplaySwitch 3:“扩展”模式
  • DisplaySwitch /externalDisplaySwitch 4:“仅第二屏幕”模式

同样,只要将带 /external/internal 开关的命令分别填入“Do Command”和“Undo Command”栏内即可,该程序不要求使用管理员身份运行,可不勾选“Elevated”复选框。

停止串流自动锁定

Windows 的 user32.dll 库提供 LockWorkStation 函数来锁定系统,可使用 Rundll32 程序执行。只需要在“Undo Command”中填写命令 rundll32 user32.dll,LockWorkStation 即可——没错,“Do Command”和“Undo Command”可以只填写一个。

全部完成后的效果如下(不要忘记先后点击页面底部的“Save”和“Apply”按钮保存设置):

测试与使用

如果你正在调试类似的远程桌面方案,强烈建议额外安装一套远程控制软件备用,以防把主显示器弄黑之后电脑失联。

按照上面的说明设置完毕后,在另一台设备上安装 NVIDIA GameStream 的开源客户端 Moonlight 并在 Sunshine Web 控制台中与服务端配对,然后打开预设的 “Desktop” 应用程序看看效果。确认无误后,即可在 Sunshine Web 控制台中的“Applications”标签中添加要玩的游戏(不先添加游戏是为了防止坏档)。

可以看到,如果某些游戏需要额外的准备命令,也可以单独进行附加设置;或者对该应用禁用全局准备命令,单独从头开始设置。添加应用同样要点击“Save”和“Apply”按钮保存。

最后在 Moonlight 客户端内打开添加好的游戏即可开玩。如果需要使用模拟手柄功能,则还需要安装 ViGEmBus 驱动。如果看着画面很糊且确认虚拟显示器驱动没有问题,那大概率是因为 Moonlight 客户端的默认分辨率是 720p,调高就好了。


用 Sunshine + Moonlight 打造带有“隐私模式”的游戏串流服务
https://www.xkww3n.cyou/2023/09/18/sunshine-moonlight-game-streaming-privately/
作者
xkww3n
发布于
2023年9月18日
许可协议