Sunshine-Moonlight 串流方案配置经验

1. 背景

串流的使用场景自然不必多说:

不方便将设备携带出去,但是仍然有远程访问设备 / 远程游戏的需求

2. 现有串流方案对比

2.1. 远程桌面

远程桌面严格意义上来说并不能算是” 串流 “。优点是流量消耗较少,缺点是算法缘故,只适合画面变化不太的应用,比如日常办公或者写代码等。

2.2. Parsec

优秀的串流平台,自带 NAT 打洞和中继,不同设备只要登录同一账号就可以互相搜索到。抓取显示器显示并编码视频流传输,算法优秀,对游戏非常友好,操作延迟相当低。

缺点是账号登陆逻辑有些抽象,一段时间不用就要重新登陆,公网 IP 变动后每次登录都要邮件验证,造成一些麻烦。

2.3. Sunshine-Moonlight

优秀的串流工具,和 parsec 一样抓取显示器显示并编码视频流传输,算法优秀,对游戏友好,操作延迟低,体验上和 parsec 区别不大。

最大的优势是项目开源,不需要注册登录,且配置上具有很大的灵活性。缺点是不像 parsec 一样自带设备发现、虚拟显示器和 NAT 打洞,需要自己折腾组网或者端口映射。


最后比较下来还是选择了 Sunshine-Moonlight 方案

  • Sunshine 在需要被串流的 PC 上部署,作为服务端提供串流服务
  • Moonlight 客户端可以安装在 PC、手机、平板、电视等各种平台上,通过局域网 / 远程连接到 Sunshine 服务端进行串流

内网穿透方面,个人推荐使用 Tailscale 虚拟组网,实现远程串流。

3. Sunshine 服务端配置

Sunshine 服务端在 GitHub 开源。除了官方开源版以外,还有一些国内社区自己修改的版本。经过尝试和比较,感觉官方版 Sunshine 还是最佳选择,结合开源的 ParsecVDisplay 虚拟显示器,在串流时可以拥有非常不错的性能与体验。

配置流程:

  1. 直接前往官方 GitHub 页面下载并安装
  2. 右键 Sunshine 托盘图标可以打开 Sunshine 控制页面。初次登录 Sunshine 会要求设置用户名密码,设置完毕后将语言修改为中文
  3. 关闭即可。以后 Sunshine 服务端会自行开机启动并运行在后台,等待连接

4. Moonlight 控制端配置

直接在官方网站 / Google Play 下载 moonlight 应用,或者去项目 Github 页面下载安装包安装即可。移动端 Moonlight 客户端可以选择一些国内的修改版,功能相对更为完善且易用。

  • 启动后,Moonlight 会自动搜索当前局域网下的 Sunshine 服务端,并显示在列表中。你也可以手动输入 IP 地址来连接到指定的 Sunshine 服务端
  • 第一次连接到某个 Sunshine 服务端时需要进行配对,配对完毕后,以后再连接只要点击即可直接进入

5. 虚拟显示器配置

5.1. 问:为什么需要虚拟显示器?

虚拟显示器安装在被串流的设备上,在特定情况下模拟显示器的视频流输出能力

和 Windows 自带远程桌面不同,Sunshine 通过抓取显示器显示内容进行串流传输,因此当电脑显示器关闭或者笔记本合盖时,显卡不会进行视频输出,串流也就无法运行了。此时就需要虚拟显示器的帮助,让 Sunshine 可以正常捕获到视频流。

另外,还可能有一些特殊的需求:

  1. 希望在串流时关闭设备屏幕,仅在串流设备上显示。这不仅有助于避免光污染,有时候也能避免一些尴尬情况(滑稽
  2. 某些场景下被串流设备没有显示器(比如 GPU 服务器等),此时就必须通过虚拟显示器来进行串流

如果没有上面这些需求的用户,可以直接跳过本节

5.2. 虚拟显示器选择

GitHub 上可用的虚拟显示器项目不少,推荐两个项目:Virtual-Display-Driver (HDR)nomi-san/parsec-vdd,而本文中将主要使用后者进行介绍(其性能相对较为优秀)。

配置流程如下:

  1. 首先前往 GitHub 页面下载最新版 Release 版本并安装(可能需要再覆盖一遍最新的 GitHub Actions 构建版本)
  2. C:\Program Files\ParsecVDisplay 加入到 PATH 环境变量,并重启电脑
  3. 启动 ParsecVDisplay,在 APP 中可以手动添加、删除虚拟显示器,并进行相关设置等,可以体验一下
  4. 点击 Custom 按钮,为 Parsec 驱动的槽位设置默认分辨率和刷新率。正常情况下填一条 ”1920x1080 60Hz” 就足够,你也可以选择什么都不填,串流时使用电脑原生分辨率创建虚拟显示器

5.3. Sunshine 对接虚拟显示器

接下来,修改一下 Sunshine 服务端的配置,使其在有客户端连接时自动启用虚拟显示器并关闭屏幕,当退出串流时删除虚拟显示器

  1. 打开 Sunshine 的配置页面
  2. 在 General → 命令准备工作 下添加一组命令
    • 打开时执行命令cmd.exe /C vdd remove all && vdd add
    • 退出应用时执行命令cmd.exe /C vdd remove all
  3. 切换到 Audio/Video 选项卡
    • 输出名称 设置为 \\\\.\\DISPLAY9(这是 ParsecVDisplay 自动创建的虚拟显示器的 ID)
    • 高级显示设备选项设备配置 修改为 停用其他显示器并仅激活指定的显示
    • 分辨率 修改为 不改变分辨率
    • 刷新率 修改为 不要改变刷新率
    • HDR 修改为不要更改HDR设置(这些设置都交给虚拟显示器来处理,不需要启用)
  4. 保存设置修改,重启 Sunshine 服务

接下来,使用 Moonlight 客户端连接到 Sunshine。第一次连接时,可能会发现虚拟显示器并没有起作用,这时需要再进一步调整:

  • 进入 Windows 显示设置,在多显示器选项部分选择 “仅在 2 上显示”
  • 这时,你会发现你的电脑 / 笔记本息屏了,而 Moonlight 上也可以看到已经切换为虚拟显示器
  • 检查屏幕显示是否舒适,如果显示过小可以调整缩放
  • 确认设置。以后 Windows 会记住你的显示器配置

这时候退出 Moonlight,再次连接,就可以看到虚拟显示器正常工作了。

5.4. 强制使用独显运行

TODO…

6. 远程串流问题

如上面所说,moonlight 不像 parsec 一样有设备发现和自带 NAT 打洞支持,需要控制端与受控端位于同一局域网中,或者可以通过 IP 地址直连,如果要远程串流得折腾端口映射等等。

个人建议配合 zerotier/tailscale 虚拟组网使用,实现远程串流。组网后不管电脑是否在身边,都可以随时通过固定的内网 IP 串流自己的电脑。虚拟组网方案相比公网端口映射有更高的安全性。

可以参考另一篇文章 《自建 Tailscale 服务并实现多设备组网互联》

7. 其他细节

  • 如果你不小心把所有显示器都禁用了,可以按下 Win+P,然后按几下上下方向键后回车,来切换到其他显示模式
  • 如果你的虚拟手柄无法工作,检查是否忘记安装 ViGEmBus 虚拟手柄驱动,以及可以尝试在 Input 设置中将 ” 模拟游戏手柄类型 “ 设置为 DS4

Sunshine-Moonlight 串流方案配置经验
https://blog.openyq.top/posts/11510/
作者
yqs112358
许可协议