我的串流方案

网络连接

网络带宽

各种常用画质所需的网络带宽:

720p 60Hz: 10Mb/s

1080p 60Hz: 20Mb/s

1080p 120Hz: 30Mb/s

2k 60Hz: 40Mb/s

2k 120Hz: 60Mb/s

4k 60Hz: 80Mb/s

4k 120Hz: 115Mb/s

外网环境下网络带宽取决于服务端的上行带宽,国内普通家庭宽带的上行带宽比较有限,哪怕是千兆宽带,电信/联通的上行带宽往往也只有60Mb/s。相比之下,移动宽带的上行带宽给得大方一些,可能超过100Mb/s。具体上行带宽有多少可以自行测速,往往不会超过40Mb/s。因此外网环境下,更常用的是1080p 60Hz的画质,这个画质对于移动设备来说也足够了。

网络延迟

外网环境下网络延迟很容易受各种因素影响,根据经验,同城延迟大约在10ms,跨城延迟取决于地理距离/是否跨省/是否跨网络运营商,延迟从15ms(相距300公里时实测)到上百ms不等。跨省、尤其是跨网络运营商的时候,有可能因为串流流量较高,或者因为处于网络高峰期而被限流。被限流时可能网络平均延迟并不算高,但是丢包严重,导致剧烈抖动乃至无法串流。

网络抖动

串流对网络抖动很敏感,隔三岔五的抖动非常影响体验,因此服务端和客户端都尽量使用有线网络,这样网络抖动可以显著降低。尤其是服务端,如果网络不稳定,自然会影响所有客户端。

如果实在缺少有线网络的环境,或者客户端是移动设备,也务必避免使用2.4GHz的Wifi,因为很容易受到外部环境干扰,导致频繁抖动。尤其是蓝牙设备(耳机/手柄)和2.4GHz的Wifi在一个频段上,会相互干扰,出现不可忍受的网络延迟。

手柄连接

客户端设备连接上手柄后可以通过手柄直接操控Moonlight界面来启动或者退出串流,长按Start可以在串流中开启/关闭右摇杆的鼠标模拟功能。退出当前串流的按键组合是Select + Start + LB + RB。

由于客户端可能运行在多种操作系统环境下,因此推荐使用Xbox手柄,各个操作系统都能兼容,或者至少使用带有XInput的第三方手柄。

防止电脑睡眠或锁定

  • 进入设置 > 系统 > 电源和睡眠,将“睡眠”选项设为“从不”,但可以设置“屏幕关闭”时间(如5分钟后)。
  • 部分笔记本电脑的“合盖”操作可能触发睡眠,需在电源设置中调整“合盖操作”为“不采取任何操作”。
  • 进入设置 > 账户 > 登录选项,将“动态锁定”或“屏幕超时锁定”关闭。
  • 可通过Win + R运行netplwiz,取消“要求输入用户名和密码”选项(需谨慎,会降低安全性)。
  • 在Sunshine的Web配置界面(通常为http://localhost:47990)中,检查“通用”设置,确认无休眠相关限制。
  • 可尝试以管理员权限运行Sunshine,避免权限问题导致服务中断。
  • 进入设备管理器 > 网络适配器,找到当前网卡,右键属性,在“电源管理”中取消“允许计算机关闭此设备以节约电源”。
  • NVIDIA显卡:在NVIDIA控制面板的“管理3D设置”中,将“电源管理模式”设为“最高性能优先”。
  • AMD/Intel显卡:在对应控制面板中禁用节能相关选项。
  • 使用Powertoys的Awake功能,或第三方工具如Caffeine,来防止电脑进入睡眠状态。

WOL (Wake On LAN)

一段时间不操作,PC就进入休眠状态,不再响应串流请求。所以需要给PC开启WOL功能,可以在局域网内通过网络请求唤醒PC。为此要在BIOS以及网卡驱动里分别开启对应功能,如果是通过有线网络唤醒,那就更改有线网卡的配置,如果是通过无线网络唤醒,那就更改无线网卡的配置。通过有线网络的唤醒更可靠一些,不过实测无线网络唤醒也是可以正常工作的。

如果是在局域网内,Moonlight启动后会自动发送唤醒请求,不用手动操作。如果在外网环境就麻烦一些了,因为唤醒请求只在局域网里有效,没法直接在公网上唤醒设备。整体的思路是要有一个不会休眠的设备,拥有公网ip,而且处于局域网内,由它代为发送唤醒请求。这个设备一般就是家里的路由器,而不少路由器系统(尤其是开放路由器系统)是提供相应的用户界面来手动唤醒局域网里的任意设备。这种场合下,只要通过路由器的公网IP登录路由器的管理页面,就可以在外网唤醒机器了。

具体可以查看官方文档:https://github.com/moonlight-stream/moonlight-docs/wiki/WOL-(Wake-On-LAN)

断电处理

如果突然停电导致机器关机,那就无法通过网络唤醒了。需要在PC的BIOS里的电源管理部分,配置类似于“(非正常关机时)上电后自动开机”的功能,这样恢复供电后PC会自动开机。

虚拟屏幕

Sunshine需要PC外接显示器才能投屏,也就是在PC的显示设置里能看到显示器。一个方案是购买硬件欺骗器,类似于U盘,插在电脑的显示端口上,充当一个虚假的显示器。更推荐的是软件模拟的方案。从windows 10开始自带了对虚拟屏幕的系统支持,通过安装自定义用户驱动就能随意创建任意分辨率和刷新率的虚拟屏幕。如果操作系统版本不低于windows 11 23H2,创建出来的虚拟屏幕还支持HDR。相关的软件不止一种,比如这个:VirtualDisplay

部分版本在Sunshine配置的Audio/Video部分即可找到虚拟显示器。

局域网串流

首先在手机下载Moonlight,在电脑端安装Sunshine。如果是电脑串电脑,也可以用Parsec。

Moonlight可以根据需求安装这个版本,提供更多功能。

Sunshine可以根据需求安装基地版本,提供更多功能。

然后打开Sunshine,进入https://localhost:47990/配置用户名和密码。

此时在手机端的Moonlight就可以看到电脑了,在电脑端输入PIN码连接即可。记得把Video/Audio部分调成独立显卡+只启用指定显示器。

电视串流

在电视上安装Moonlight,再连接一个无线手柄,就可以直接在电视上游玩,无需将PC搬到电视旁边。

  • 电视的安卓版本太低,不支持手柄的无线连接。考虑加装一个高版本的电视盒子,在电视盒子上安装Moonlight;或者距离允许的话,用手柄直接无线连接服务端PC,这样还能有PC原生的手柄振动支持。

  • 电视硬件太旧,运行Moonlight吃力。同样考虑加装电视盒子。

  • 如果电脑和电视都支持4k 120Hz,那需要超过百兆的网络传输速率。此时如果想通过网线连接电视来保证最低的延迟,就会发现哪怕是目前的旗舰电视,网口也只有百兆。对于这种情况,要么退而求其次,使用无线网络,要么购买USB网卡,前提条件是电视至少是Android 10版本,并且有USB 3.0接口。推荐的USB网卡芯片是RTL8153或者RTL8153B,这两个型号的兼容性最好,其中后者的能耗和稳定性更佳。

远程串流

IPv4

首先,需要联系运营商获取公网IPv4地址,然后光猫改桥接,路由器PPPoE拨号获取公网IPv4地址。

然后开启路由器的upnp功能,同时在Sunshine的Configuration->Network下面也开启upnp。最后一步是在外网环境下打开Moonlight,手动添加机器,直接填写路由器的公网IPv4地址,如果一切顺利的话就能识别到家里的PC。

IPv6

目前国内的三大网络运营商(电信/联通/移动)都提供家庭宽带的公网IPv6地址,电信/联通/移动的公网IPv6地址分别以240e/2408/2409开头。只要在路由器中开启IPv6功能,家里所有设备就都拥有了公网IPv6地址。之后在Sunshine的Configuration->Network下面开启IPv4 + IPv6选项,就能让Sunshine跑在公网IPv6地址上。

在Moonlight里添加机器的时候,填写Sunshine所在机器的公网IPv6地址就可以了。注意填写的格式为[ipv6地址],有一对中括号。如果要指定端口,那就是[ipv6地址]:端口号。IPv6方案是客户端直连Sunshine机器,所以填写的是Sunshine机器的IPv6地址,而之前的IPv4方案是客户端去连接路由器的IPv4地址,依靠路由器的upnp功能转发IPv4流量到Sunshine机器。

防火墙

在路由器上把串流使用到的端口加入防火墙的IPv6白名单,具体使用了哪些端口可以在Sunshine的Configuration->Network页面上查看。添加白名单的操作步骤因具体路由器而异,IPv4和IPv6各自有一套白名单,注意区分。也可以直接关闭防火墙。

电脑的防火墙尽量还是不要关,在电脑上开放对应端口:

1
2
netsh advfirewall firewall add rule name="sunshine_udp" dir=in protocol=udp localport=47998,47999,48000 action=allow
netsh advfirewall firewall add rule name="sunshine_tcp" dir=in protocol=tcp localport=47984,47989,47990,48010 action=allow