前言
最近把路由器刷了 OpenWrt,顺便折腾了一下 IPv6,发现给的居然是公网地址(原谅我的无知),也就是说我们可以把主机的服务发布到公网上了。
其实最开始没有想整串流的,串流只是用来测试网络的一种使用场景罢了。但是最近买了怪猎世界,这个游戏极其适合串流场景下游玩,就准备进一步搞搞。
Sunshine 的设置
我用的 Sunshine 是基地版的,项目地址为 https://github.com/qiin2333/Sunshine-Foundation ,一个原因是基地版会帮你设置虚拟显示器,这样就可以实现不亮屏的情况下串流(如果你用原版的话,需要有一个屏幕亮着来让 GPU 输出)。
配置这里就不讲了,不过如果要发布到公网的话,建议还是谨慎设置安全相关的一些配置项。
btw:在 IPv6 环境下串流需要将 IP 族选项更改为 IPv4 + IPv6,否则可能出现 -1 错误。

内网中的测试
首先在内网中测试一下串流的性能。
我用的路由器是 小米 AX3000T(刷 OpenWRT 系统),这是一个比较一般的入门级路由器。
主机配置为 R7-7745HX + RTX 4070 Laptop + DDR5 32GB,有线千兆内网。
串流设备为 Surface Pro 7 i3-1005G1 + DDR4 8GB + AX201 网卡,无线 WiFi-6。软件为 Moonlight 官方版,2736×1824 60fps(开启垂直同步)80Mbps,解码器为 H.225 (HEVC)。
在床上测试一下性能(串流设备距离路由器大概 2m):

对于怪猎这种不怎么吃反应(应该)的游戏是够用了,注意要开启垂直同步,否则串流画面会有明显的撕裂现象。
发布到外网与测试
我是不想将整个主机的 IPv6 端口公开到外网的,所以我选择了路由器上端口转发的方式。用 socat 插件将 Sunshine 所需的端口全部转发,

有条件的可以再配置一下 DDNS,这里就不详细讲了。
然后这里我用手机开热点给串流机上网,模拟一下外网环境。Moonlight 中填写公网的地址,如果你配置了 DDNS 就写你的域名。

多了大概 30ms 的网络延迟,其实也还好了。外网环境下最重要的是丢帧率,如果太高就会有明显卡顿。0.82% 的丢帧率还是可以接受的。
但是注意外网串流的时候比特率可以稍微降低一些,我 80Mbps 测了两三分钟跑了 355MB 流量…