体验较好的低延迟串流方案 | MoonLight+Sunshine+Tailscale


I.前言

关于网络串流用于游戏工作这方面文章,网络上已经有较多成品,不过很多都言之不详,又或是内容可能有些过时之类的。这里我总结出自行搭建的经验给大家参考。本教程完全基于Windows环境,其他环境请自行摸索。

为什么不使用Parsec,可以到文末杂谈中查看咱的闲聊o((>ω< ))o

II.需求

文中提到的所有软件均可在此处下载。

必须

  1. [硬件]宿主机,最低系统要求:Windows 10 21H2
  2. [软件]SunShine(Github Releases)
    串流服务器
  3. [软件]Moonlight
    串流客户端
    官方PC版:Github Releases
    移动端:推荐使用修改版TZJ Github Releases
  4. 较好的网络环境,最好有IPv6或公网IP
  5. [软件]Tailscale(官网)
    虚拟组网软件+点对点文件传输
  6. [软件]Parsec-vdd v0.45 (官网下载)
    虚拟显示器
  7. [软件]vddswitcher (Github Releases)
    虚拟显示器分辨率切换工具

可选

  1. [软件]AudioRelay (官网)
    麦克风或其他音频穿透
  2. [软件]LocalSend (Github)
    跨平台局域网文件,文本,剪切板传输工具
  3. [软件]SyncClipboard (Github)
    自动检测剪切板,文件同步

其他 - 米系游戏启动器

  1. [软件]咪咕 - 星铁移动UI (Github Issue)
  2. [软件]原神fps-unlock by 34736384 (Github Releases)
    用于启动移动端UI
移动端为何选择TZJ版?

官方移动版缺乏原生触控输入,较为方便的分辨率和码率修改功能。修改版本配合Sunshine使用,体验非常好。所有修改内容详见该项目主页(Github)

阿西西版功能更多,为什么不用阿西西版?

详见:"阿西西的日常" : 游戏串流界小偷、假大佬、毒瘤up主

III.网络环境

使用网络串流,尤其是游戏串流,一般不推荐中转模式(较高的延迟和不稳定的串流体验)。我的建议是,在任何使用环境下,能使用直连模式就不要使用中转。

本文使用Tailscale进行打洞组网而不是暴露端口方案,以下是配置好网络环境的方式。

1.桥接模式

光猫桥接模式可以去除光猫与路由器之间一层NAT。

无论是否有公网IP,桥接模式都可以通过联系运营商直接修改。

这里需要注意,修改桥接模式后需要自行在路由器侧配置宽带账号密码才可上网。在修改之前,务必知道自己的宽带账号密码。如果不了解,可以拨打对应运营商客服电话进行获取。

重置宽带密码可能需要如下材料:

  1. 号主姓名与身份证
  2. 宽带安装地址
  3. (部分运营商与地区)号主人脸识别/视频客服查询

建议使用宽带对应的手机号主卡拨打客服电话以避免不必要的身份验证(非必须)

2.开启UPnP

在路由器端找到UPnP或者端口自动转发相关设置,开关直接开启即可。

3.进一步降低打洞难度

一般情况下,满足以下任意一者即可。

IPv6网络环境

由于IPv4 IP地址相对饱和,国内运营商一般默认不会给用户公网IP,电信运营商部分地区可以直接申请获得,而联通相对麻烦,移动基本不太可能获得。

而IPv6可以说是取之不尽,用之不竭的,且开启较为轻松,一般开启即是公网。一般情况下,无论是桥接模式还是光猫路由模式,家庭宽带都可以在路由器侧直接开启IPv6。以小米路由器为例,在IPv6设置中开启IPv6,模式选择Native即可自动获取。

该方案需要连接端与被连接端均拥有IPv6网络环境。

注:国内运营商手机使用蜂窝移动网络时,IPv6自动开启。

IPv4公网IP获取

鉴于前阵子 工信厅联通信函〔2024〕263号 推进网络去NAT的专项工作,大意可能是推进IPv6普及,有可能进一步提高IPv4公网IP获取难度,本方案仅供参考,当前成功概率不高。

若使用中国电信运营商宽带,截至目前部分地区申请IPv4仍然较为容易,打一通电话要求提供公网IP就可以解决了。移动基本不可能,联通需要尝试。

4.为宿主机分配静态IP地址

为了避免DHCP租约到期更新宿主机IP地址导致需要重新在Moonlight中手动指定,我们可以在路由器中找到类似DHCP静态分配 字样的设置,将宿主机设为静态即可。本文以爱快iKuai路由系统为例,在此处设为静态即可。

IV.配置Tailscale

对于Android端,下载好Tailscale APP,登录账号后,直接点Connect即可使用。

以下内容摘自Ghost_Chu's Blog - Tailscale 安利指南 ,仅摘取必要部分,几乎未作修改。对于对Tailscale应用本身以及各项功能的详细介绍,还请访问原作者的博客查看
感谢原作者,请大家多多看看这位大佬的博客哦qwq

获取一个 Tailscale 账号

Tailscale 账号是您的 Tailscale 之旅的开始。

前往 Tailscale 官网,打开登录页,并选择一个方式登录,登录时就会自动完成注册。

注意!

一旦您选择了一种登录方式,就无法再次改变了!

既不能更改为其它登录方式,也不能解绑,也无法添加更多登录方式。
考虑到你需要在其它设备上通过相同方式登录鉴权,最好选一个没有访问困难的登录方式。

添加你的第一台设备到 Tailscale 网络

在机器上安装 Tailscale 客户端后,即可连接到 Tailscale 网络。本文使用 Windows 版本的客户端作为示例。

在安装好 Tailscale 并启动后,你会收到一个通知提醒,要求你登录 Tailscale 账号。

在点击并在弹出的网页中完成登录后,会弹出这样一个提示,警告我们虽然设备已经登陆了,但还没有连接到网络,必须管理员来手动批准一下。

点击 "Open in admin console" 打开控制台,找到需要批准的设备,点击菜单中的批准即可连接。

如果这是你的长期使用的设备,还可以选择 “Disable key expiry” 来禁用密钥过期,这样就会保持连接和登录,否则在一段时间后,设备会自动断开连接,并需要重新批准。

批准后,系统弹出通知,此时你的 Tailscale 就成功连接到你的网络中了。你也能够访问其它同 Tailscale 网络中的设备了。在其它设备上如法炮制,即可添加和连接更多设备。

如果你将 Tailscale 安装在 Windows 上,且希望作为服务器使用,请启用 Preferences 中的 Run unattended 选项,以服务形式运行。否则重启后需要登录到桌面 Tailscale 才会起效,如果你恰好除了 TS 外其他方式都连不上这台机器,那么恭喜你这台机器就会失联了

Tailscale Subnets - 共享局域网的其它设备

Tailscale Subnets 能够让指定客户端分享它所连接的局域网(LAN)的其它设备。这样就算其它设备没有 / 无法安装 Tailscale,您也可以访问它们。

barbatos 设备连接到了一个局域网(LAN),路由器设置其所在网络 CIDR 表示为 192.168.0.0/24,对应也就是 192.168.0.0 - 192.168.0.255 这一段,我可以通过 192.168.0.1 访问到路由器后台。CIDR 可使用 CIDR 计算器算出。

通常家用路由器的 CIDR 都是 192.168.x.0/24。例如设备 IP 是 192.168.1.3,那么通常填写 192.168.1.0/24 即可。

跟随官方教程,在 barbatos 设备上运行命令:

tailscale up --advertise-routes=192.168.0.0/24

成功后,打开 Machines 控制台,找到 barbatos 设备菜单的 “Edit route settings……” 选项,可以看到我们刚刚声明的网段出现在了这里:

打勾选中保存即可访问对应网段的资源了。如果仍然无法访问,则需要在客户端的 Preferences 中打开 “Use Tailscale subnets” 选项。

分享的网络的网段不能重复,如果重复,请选择一个网络并在路由器上的 DHCP 服务中将其更改到其它网段。

Taildrop - 点对点文件传送

在需要发送的文件上右键,选择 “Send with Tailscale……”

弹出 Send with Tailscale 窗口,在右边点击选择发送到的设备。

文件会立刻开始发送,并显示文件发送进度。

发送成功后,文件会保存在目标机器的 “下载” 文件夹中。

V.配置Sunshine

1.下载安装

在Github Releases上下载对应系统版本的Sunshine,安装过程一般一路下一步即可。安装好后,任务栏会出现Sunshine的图标,如图所示:

点击这个图标(左键右键应该都可以),点Open Sunshine,随后进入Web界面。默认的Web管理地址是:localhost:47990。由于我们没有为Sunshine管理地址配置证书,会出现HTTPS报错,不是加密连接。不用管,直接或在更多选项中点继续访问即可。

在第一个界面,需要我们设置Sunshine用户名和密码,此处设置一个可以记住的账号(Username)密码(Password)即可,后续登录需要使用。

2.使用虚拟显示器

成功登入Sunshine后台之后,设置一般不需要改动,单使用一个PIN码界面即可实现链接电脑并使用。不过,由于宿主机显示器分辨率不一定会与连接端完全匹配,连接端显示器刷新率等各项参数也都不同,使用虚拟显示器可以大大改善串流体验。

本教程使用Parsec VDD配置虚拟显示器,利用 Github - vddswitcher 实现Sunshine对虚拟显示器分辨率的自动切换。


其他虚拟显示器兼容情况见下表(来自Github - parsec-vdd):

项目Iddcx 版本驱动签名游戏HDR硬件鼠标指针可调整手柄支持
usbmmidd_v2
IddSampleDriver1.2
RustDeskIddDriver1.2
Virtual-Display-Driver (HDR)1.10
virtual-display-rs1.5 #81
parsec-vdd1.5🆗

✅ - 完整支持, 🆗 - 有限支持

驱动签名 意味着这个虚拟显示器驱动有一个有效的数字签名。硬件鼠标指针 意味着有硬件鼠标指针支持,缺少该支持可能会在某些远程桌面应用中有双重鼠标指针。可调整 意味着具有自定义显示模式的功能。前往 MSDN IddCx versions 可以查看Iddcx支持的最低Windows系统版本。


Parsec VDD安装直接一路下一步即可。vddswitcher使用方式如下:

  1. 将Github Release中下载到的zip解压,将其中两个文件放到一个非中文路径下。
  2. 定位到如下界面,若最上方选项非简体中文,可更改为简体中文

  1. 在下方命令准备工作中添加一个。打开时执行命令:cmd /C "D:\GameStreaming\vddswitcherd.exe" -x %SUNSHINE_CLIENT_WIDTH% -y %SUNSHINE_CLIENT_HEIGHT% -r %SUNSHINE_CLIENT_FPS% 和 退出应用时执行命令:cmd /C "D:\GameStreaming\vddswitcher.exe" 。其中请将D:\GameStreaming\改为你存放vddswitcher.exe和vddswitcherd.exe的文件目录。 以上两个命令可以实现连接时自动创建虚拟显示器并切换分辨率。

有关Parsec VDD虚拟显示器的分辨率,刷新率支持情况,详见文末表格。如果遇到不支持的分辨率,可以看附录自定义分辨率相关教程。

VI.配置Moonlight

注意:使用之前不要忘记先在连接端打开Tailscale!

Windows版本

只修改如下两个设置项即可很好使用了

其中,分辨率改为原生,即可全屏覆盖。捕获系统快捷键可以避免Win键等按键反馈到宿主机。注意,此时退出需要用Ctrl+Shift+Alt+Q按键退出串流。

添加宿主机,可以使用右上角的添加电脑按钮,IP为上文II中静态指定的IP。

Android版本

配置方式基本相同,不再带图,使用文字描述。

打开Moonlight APP后,左上角"+"号打开,输入静态指定的IP即可链接宿主机。

右上角齿轮处打开,可以对串流进行各项配置。设置选项可以根据使用需求,结合下方提示按需开启。

分辨率/帧率/码率问题

以下任何一个设置,数值越高,对网络的要求均会变高。想要获得流畅的串流体验,需要连接端,路由器,宿主机的网络链接质量好。无论是有线还是无线串流,都建议使用更高性能的路由器。对于无线,尽量选择5 GHz或者以上的频段,WiFi 5/6/7等更高的WiFi版本,以获得更好体验。

  • 对于视频分辨率

    使用原生分辨率可以获得屏幕全覆盖的优良体验,在低延迟情况下可以让串流接近实机运行,建议任何情况下都采用原生分辨率;

    在安卓端,原生分辨率如有多个选项,对应手机设置中屏幕分辨率的多个选项。选择更低的一者并适当降低码率,可以在使用蜂窝移动数据时节省流量开销,或在较差网络环境中串流时改善串流体验。

    特别提醒:多数全面屏安卓手机分辨率各异,Parsec VDD支持的分辨率可能无法满足特定型号手机原生分辨率情况。这可以通过文末附录中,自定义分辨率相关内容,添加手机的原生分辨率与刷新率解决。

  • 对于帧率

    选择较高的帧率可以在网络连接状况合适的情况下获得更流畅的画面体验。

  • 对于码率

    高码率可以在动态场景下画面更清晰(不糊),而低码率则能节省网络开销,增强较差连接环境的串流体验。不过相应的,画面也会更糊。

码率选择的小提示

目前我国三大运营商对家庭宽带提供的上行带宽基本上都是比较小水管的级别。

若不考虑流量开销,对于中国电信家庭宽带,在外串流时,码率可以控制在30Mbps-45Mbps左右。若你的网络环境上行带宽高,可以选择更高的码率获得更好体验。

若考虑流量开销,仅使用串流进行远程办公的话,可以将码率控制在10Mbps以下,基本上4Mbps就可以胜任办公需求(当然,牺牲了动态画面的画质。码字表格这些一般不会很模糊)。

这里提一嘴,这篇文章我也是完全通过Moonlight串流完成,使用蜂窝移动网络,限制码率4Mbps,中间有段时间开到10Mbps利用Typora和Typecho网页编辑器编辑。该使用场景下,使用时间大约4小时30分钟,消耗流量约2.5GB。
串流设备为Surface Pro 5,从满电到串流结束大约消耗78%电量,全程使用Windows 10 节电模式。

在局域网串流,如果百兆以上局域网(不包括百兆),在各终端性能合适的情况下,可以尽量将码率调高,从而提升画质。

VII.其他:米系游戏原生触控操作

在官方或者移动修改版Moonlight原生支持触控输入的情况下,我们可以通过一些手段,让《原神》和《崩坏:星穹铁道》由PC端UI改为移动端UI启动。具体方式如下:

《原神》

对于原神,我们借助34736384大佬的genshin-fps-unlock应用(Github Releases)进行帧率解锁并启用移动端UI。

简单阐述一下软件使用方式。

第一次启动如果未自动查找到游戏路径,软件会让你手动定位游戏文件。找到启动器目录,在那个目录中找到Genshin Impact Game文件夹。国服选YuanShen.exe,外服选GenshinImpact.exe即可。

启动器内配置如下即可。

对于Moonlight串流,最好勾选Start Game Automatically

软件设置好后,在Sunshine设置中,打开上方"应用程序"选项卡,点"添加新应用",按如下进行配置:

其中,箭头所指部分,将路径改为存放unlockfps_nc.exe的路径即可。

《崩坏:星穹铁道》

《崩坏:星穹铁道》采用咪咕快游的触摸UI解决方案。由于该方案存在Bug,具体实现方式建议自行研究。触屏启动器地址:Github Issue

简单提一嘴,工具中的sr_config.json注释如下:

{
  "game_path": "C:\\Program Files\\Star Rail\\Game\\StarRail.exe", # 游戏路径,需要使用两个斜杠代替一个斜杠
  "enable_login_token": false, # 是否不保存登录信息
  "enable_mobile_platform": true, # 启用移动UI
  "enable_xinput": false # 启用手柄(建议直接用PC端原生启动器配合Moonlight手柄穿透使用)
}

《崩坏3》

《崩坏3》PC版仅是对移动端简单移植,可以直接触控,不需要修改。

《绝区零》

暂无解决方案。

VIII.部分功能缺失的补全方案

剪切板/文本/文件传输同步

剪切板,文本和文字传输功能,均可使用Tailscale自带的点对点传输。但Tailscale传输功能相对简单,传输文件较为便利,对于文本的传输尚有欠缺。下面推荐一些开源的工具,连接均可在文章开头找到。

  • 首选推荐:LocalSend。LocalSend具有独立界面进行文件传输,可以传输文本,文件,剪切板内容,体验统一且多平台(Android,iOS,Windows等)支持完备,UI简洁。同时,它具备扫描各个局域网内其他运行LocalSend设备的功能(Tailscale的虚拟局域网也可以),下面是程序界面:

  • 剪切板同步:SyncClipboard。该程序可实现剪切板监控,自动上传。需要一个主机作为同步服务器,可以在Docker中部署服务器,也可以使用主程序直接作为服务器(客户端与服务器可以共存,下载客户端即可开启服务器)。从而建立起一个同步网络。所有客户端只需连接单独一个服务器,即可实现所有客户端的剪切板同步。

被连接端IP与Moonlight串流IP一致,指定为宿主机内网IP或Tailscale的虚拟IP即可。

麦克风穿透

可以使用"AudioRelay"(官网地址)软件进行音频串流。免费版默认支持一个设备点对点,已经够用了。

该软件支持不同设备相互串流,包括但不限于手机作为麦克风通过网络传输到电脑等功能。

Windows版安装时,一路下一步不需要改动任何设置即可。

此处我们借助Tailscale虚拟组网。

在宿主机和连接端均开启Tailscale的情况下,在宿主机开启"播放器"功能,在连接端开启"服务器"功能,然后在宿主机上使用连接端在Tailscale上的虚拟IP(可通过Tailscale 控制台对应设备的ADDRESSES栏目查看。),用"使用IP地址连接"功能进行连接,并在右侧菜单处使用麦克风模式。

连接成功后,在语音软件或游戏中选择AudioRelay的虚拟麦克风Virtual Mic for AudioRelay就行啦。

以下是示例图片:

IX.结尾&杂谈

至此,一套舒适的远程串流方案就搭建完啦,有什么问题可以在评论下方留言,暑假期间有空,大家的留言可以帮助我更好地修缮这篇文章owo

杂谈1:为啥不用Parsec呀

Parsec也是一个非常好用的远程串流软件,软件本身的功能丰富,使用方便,也有内置的打洞工具。他们做的虚拟显示器驱动也很优秀,本教程用的就是Parsec的虚拟显示器驱动,总的来说,Parsec对于桌面端的连接端也推荐使用的哦qwq。

我之前也有写过与Parsec相关的简易教程,不过现在用Moonlight+Sunshine,原因如下:

  1. 触控支持:Parsec本身对触控操作的支持基本没有。我的远程串流,基本上就是在Surface上玩玩游戏,外出办公。使用Parsec,由于缺乏原生触控输入,原来在Surface上使用的触屏手势基本用不了,触控板也比较麻烦。在安卓端,我用的是OPPO平板,在游戏助手中屏蔽所有安卓系统手势,使用阿西西修改的Moonlight,原生触控输入,局域网中,几乎可以把这个安卓平板当作小Surface来用,非常酷。而Parsec...根本用不了属于是。
  2. 画质:Moonlight客户端允许自定义更高的码率,画质的配置也更丰富,在局域网下,可以获得更好的画质体验。
  3. Parsec在中国移动(CMCC)网络环境下有可能会被封锁,而Tailscale暂时没遇到类似情况。

杂谈2:还没想好(之前要写,但是过一会儿忘了TwT)

X.附录 - 虚拟显示器

1.Parsec VDD原生支持的分辨率

如果你的显示分辨率不在下面列表的支持范围之内,使用下方附录2的自定义分辨率即可。

分辨率常用名称长宽比刷新率 (Hz)
4096 x 2160DCI 4K1.90:1 (256:135)24/30/60/144/240
3840 x 21604K UHD16:924/30/60/144/240
3840 x 1600UltraWide24:1024/30/60/144/240
3840 x 1080UltraWide32:9 (2x 16:9 FHD)24/30/60/144/240
3440 x 1440 21.5:9 (43:18)24/30/60/144/240
3240 x 2160 3:260
3200 x 18003K16:924/30/60/144/240
3000 x 2000 3:260
2880 x 18002.8K16:1060
2880 x 16202.8K16:924/30/60/144/240
2736 x 1824 60
2560 x 16002K16:1024/30/60/144/240
2560 x 14402K16:924/30/60/144/240
2560 x 1080UltraWide21:924/30/60/144/240
2496 x 1664 60
2256 x 1504 60
2048 x 1152 60/144/240
1920 x 1200FHD16:1060/144/240
1920 x 1080FHD16:924/30/60/144/240
1800 x 1200FHD3:260
1680 x 1050HD+16:1060/144/240
1600 x 1200HD+4:324/30/60/144/240
1600 x 900HD+16:960/144/240
1440 x 900HD16:1060/144/240
1366 x 768 60/144/240
1280 x 800HD16:1060/144/240
1280 x 720HD16:960/144/240

2.Parsec VDD自定义分辨率教程

以下内容照搬并翻译自Parsec官方文档

从 0.37 版本的Parsec VDD开始,你可以通过Windows系统的注册表编辑器为虚拟显示器驱动添加最多5个自定义分辨率。每个分辨率定义必须添加到注册表中下面这个路径:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Parsec\vdd

每个自定义分辨率应当在他们自己的文件夹中(上面这个路径下创建文件夹),这些文件夹的名字要按如图方式从0到4依次添加(不得超过4,如果只需要添加一个自定义分辨率,只创建0就行,以此类推)。如果这些目录(项)和值原本不在Parsec\vdd中,则需要自行创建。方法是:在注册表编辑器左侧树形栏中右键上级目录,移动光标到“新建”,然后选择“项”或者“DWORD (32位)值”

每个自定义分辨率的目录下必须包含三个DWORD值:width(宽), height (高)和 hz (刷新率) 实例如下:

由于DWORD值时十六进制的,在添加DWORD值时,选择旁边的“十进制”就可以直接输入十进制数(例如1920,1080这些的)

修改之后,重启电脑,就可以在Windows显示设置中看到新分辨率啦。最高支持的分辨率是4096 x 2160 240Hz

XI.附录 - 参考资料

  1. Parsec官方文档 - 自定义虚拟显示器分辨率

声明:Youwen|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 体验较好的低延迟串流方案 | MoonLight+Sunshine+Tailscale


挖坑不填浪三年