基于Sunshine+Moonlight方案实现串流(超级详细)
本文最后更新于 8 天前,其中的信息可能已经过时,如有错误请发送邮件到Pavilion_Cat@outlook.com

本文写了5000余字,大抵是全网最详细的教程之一吧

串流(Streaming) 是指在不需要先下载整个文件的情况下,通过互联网或局域网实时传输数据,通常是音频、视频或其他多媒体内容。

目前主流串流方案:

  • ToDesk,向日葵,Raylink:经过服务商中转的远程桌面,适合外网访问,但免费用户画质和延迟较差
  • Microsoft Remote Desktop:Windows 自带应用,配置相对简单,适合内网办公,缺点是对显卡调度有问题
  • Steam Link:Steam 自带软件,配置超级简单但不稳定,适合内网打游戏
  • Sunshine + Moonlight:网友一致好评的方案,经过多代更新,配置不再那么复杂
  • Parsec:阿猫没用过,但据说键盘鼠标兼容性不好

Sunshine + Moonlight 的优势

Sunshine 和 Moonlight 方案利用了开源技术并结合硬件加速,具有以下优势:

  • 超低延迟: 通过优化编码、传输协议和输入响应,Sunshine + Moonlight 提供低延迟的远程桌面和游戏体验,在内网环境下,延迟只有几ms
  • 高画质: 支持高分辨率和高帧率,用户可以享受近乎本地的画质。
  • 跨平台支持: 无论是 Windows、Linux,还是 Android 和 iOS,Moonlight 都能支持多种平台,提供灵活的串流体验。

通过这些技术,Sunshine + Moonlight 实现了高效、低延迟的远程桌面和游戏串流,使用户能够在各种设备上享受图形密集型应用和游戏,而无需本地高性能硬件。

环境要求

  • 一台 Windows 或 Linux 设备作为 Sunshine 服务器。
  • 一台支持 Moonlight 客户端的设备(如 PC、智能手机、平板电脑等)。
  • 网络连接要求:服务器和客户端需要在同一网络上,或者客户端需要能够访问服务器(如果使用互联网访问,需要配置端口转发或者拥有公网直接访问)。

一、安装 Sunshine(流媒体服务器)

1.下载 Sunshine:

下载最新的发行版,注意要选择 Latest 版本的(注意区别 Pre-release 的测试版),Windows选择 sunshine-windows-installer.exe 进行下载。

若无法访问GitHub,可以使用如下链接进行下载适用Windows的最新版本或特定版本:

蓝奏云盘 密码:519h

2.安装 Sunshine:

对于 Windows

  • 下载 .exe 安装文件,双击安装(保险起见,请右键使用管理员权限运行)。
  • 按照安装向导完成安装。
  • 安装过程中,请注意安装路径不能存在中文,推荐安装所有控件。
  • 新版本 Sunshine 的 Audio Sink 和 Virtual Sink 选项不用再手动设置
  • 新版本 Sunshine 在安装时会一并安装手柄驱动( ViGEmBus )与Steam虚拟声卡( Steam Audio Drivers ),因此不用像老版本一样手动安装
  • 安装完成,可以吃灰了(bushi)

注意: 若需在串流时使用其他声卡(如物理声卡),需禁用 Install Steam Audio Drivers 选项以防止 Sunshine 自动安装并启用Steam虚拟声卡

对于 Linux

  • 从源代码编译或下载预编译的二进制文件。
  • 如果你选择使用源代码安装:
git clone https://github.com/LizardByte/Sunshine.git
cd Sunshine
make
sudo make install

3.启动 Sunshine:

  • 在安装完成后,启动 Sunshine。
  • 在 Windows 上,通常可以在开始菜单中找到 Sunshine 并启动它。
  • 在 Linux 上,使用终端命令启动:
sunshine

Windows中 Sunshine 会在后台运行并在本机地址上开启一个端口作为配置页面,点击右下角状态栏的 Sunshine 图标,在弹出菜单中选择 Open,随后浏览器会跳转至 https://localhost:47990 进入管理页面。

由于 Sunshine 强制 HTTPS 访问但缺少证书,浏览器会提示非私密连接或你的连接不是专用连接,点击 详情 或 高级 后,选择 继续前往localhost(不安全),大多数浏览器以后访问这个页面时会自动跳过这个页面。

4.配置 Sunshine:

第一次进入 Sunshine 页面之后需要注册,然后使用账号密码登录该网页。(一定要记住这个账户密码,不要过分相信edge等浏览器的记住密码,阿猫有被坑过,如果忘记密码,请移步后文)

  1. 选择你要流式传输的应用或游戏:
    • Sunshine 默认会识别并列出本机安装的游戏和应用程序。
    • 你可以选择某个特定的程序来进行流媒体传输。
  2. 启用硬件加速:
    • 在 Sunshine 设置中,启用硬件加速以减少延迟并提高性能。大多数现代显卡(如 NVIDIA 和 AMD)都支持硬件编码。
    • 如果你的显卡支持 NVIDIA 的 NVENC 或 AMD 的 VCE,可以在 Sunshine 的设置中启用它们。
  3. 设置流媒体选项:
    • 在 Sunshine 设置中,可以设置编码类型(H.264 或 H.265),码率(建议设置为 10Mbps 或更高),以及音频采样率(例如 48 kHz)。
  4. 配置网络:
    • 确保你的防火墙允许 Sunshine 服务器通过的端口(默认端口为 47984)。
    • 如果需要实现广域网远程串流,请移步至后文远程串流

主机需要连接显示器才能正常串流,如果是笔记本则不能合盖。要在无显示器状态下串流,可以买一个显卡欺骗器接在电脑上,效果相当于外接一台显示器。或者直接使用虚拟显示器。

如果有需求,阿猫更推荐直接使用虚拟显示器,例如Virtual Display Driver,支持模拟 640 x 480 至 7680 x 4320 (8K) 的分辨率,刷新率包括 60hz、75hz、90hz、120hz、144hz、165hz、240hz、480hz 和 500hz,同时支持HDR,下载链接在https://github.com/itsmikethetech/Virtual-Display-Driver/releases。具体使用方式参考github说明。还有一个更易于使用的图形化的驱动是ParsecVDisplay,下载链接在https://github.com/nomi-san/parsec-vdd/releases,缺点是不支持HDR。

5.忘记 Sunshine 密码:

打开 C:\Program Files\Sunshine\config 文件夹或你的安装路径 ~\Sunshine\config 文件夹,里面有个名为 sunshine_state.json 的文件,将其删除即可恢复默认,重新启动 Sunshine 即可重新配置

二、安装 Moonlight(客户端)

1.下载并安装 Moonlight:

  • 访问 Moonlight 的 GitHub 页面
  • 下载适合你设备的 Moonlight 客户端。Moonlight 支持多个平台,如 Windows、Linux、macOS、Android 和 iOS。

Android 安装包

  • 下载链接Moonlight for Android
    • 进入页面后,你可以找到最新的 APK 文件下载链接。
    • 可以直接通过 Google Play Store 或者下载 APK 文件进行安装。
    • 手机如果没root就下nonroot版本

Windows 安装包

  • 下载链接Moonlight for Windows
    • 进入页面后,找到适用于 Windows 的安装包(通常是 .exe 格式),下载并安装。

Linux 安装包

  • 下载链接Moonlight for Linux
    • 进入页面后,你可以找到适用于 Linux 的安装包(通常是 .deb.rpm 格式),选择适合你的发行版进行下载。
    • 另外,你也可以从源代码自行编译安装。

MacOS 安装包

  • 下载链接Moonlight for macOS
    • 进入页面后,你可以找到 .dmg 格式的安装包下载链接,用于 macOS 系统。

iOS 安装包

  • 下载链接Moonlight for iOS
    • 你可以通过 Apple App Store 下载 Moonlight for iOS,或者从 GitHub 下载源代码进行自定义安装。

2.启动 Moonlight:

  • 启动 Moonlight 客户端应用。

3.连接 Sunshine 服务器:

  • 启动 Moonlight 后,客户端会自动扫描你所在网络中的 Sunshine 服务器。
  • 如果没有自动发现,手动输入 Sunshine 服务器的 IP 地址。
  • 选择你的 Sunshine 服务器并点击连接。

4.配对 Moonlight 和 Sunshine:

  • 当你首次连接时,Moonlight 会要求进行配对。你需要在 Sunshine 上确认并输入配对码来授权连接。
  • 这一过程完成后,Moonlight 将能够远程访问你的 Sunshine 服务器。

关于Moonlight的一些问题

  • 默认情况下,触摸屏的输入方式为触控板,要想直接触摸控制,需要在设置-输入设置中去掉勾选“将触控屏作为触控板使用”。
  • 在客户端设置中,可以调整分辨率、帧数、码率等设置,但要注意分辨率越高,延迟也会增加(主要因为编解码时间增加),而帧数增加可以减小一点显示延迟(不超过主机和客户端刷新率的情况下)。
  • 默认情况下,串流开始后,只在客户端播放声音。如果想要在客户端和主机同时播放声音,在客户端设置中开启“在电脑上播放声音”即可。
  • 如果想要在串流时调用原生系统触控键盘,可以三指点击屏幕,就能弹出屏幕键盘(对于Android和IOS系统)。
  • 如果使用鼠标发现速度过快,可以在设置-输入设置中勾选“适合远程桌面的鼠标模式”,这会让鼠标移动更加自然。
  • 注意,如果在安卓设备上进行串流,Windows快捷键将和安卓系统快捷键冲突,许多快捷键无法使用。要解决此问题,可以参考B站视频:Moonlight外接物理键盘,快捷键无法使用?,该作者的修改版本通过无障碍模式解决了快捷键冲突问题,同时开启了多指触控功能,可以方便的进行双指缩放等操作,真正实现了原生触控体验。

如果使用平板设备进行串流,阿猫强烈推荐使用上述修改版,开启多指触控功能,默认的触控模式仅仅是模拟鼠标操作,单指拖动模拟鼠标左键拖动,长按模拟鼠标右键,双指拖动模拟滚轮。开启了多指触控后,能直接使用Windows原生触控操作,可以进行单指滑动,双指缩放和三指下拉等操作,解锁更丝滑的串流体验。

三、广域网远程串流

实现远程连接,延迟最低的方法是公网直连或P2P直连。但由于IPv4地址匮乏,国内大多数家庭网络并不具备公网IPv4地址。

1.有公网的情况

公网在运行 Sunshine 的设备上

这是最简单的方式,只需要在防火墙中放行 Sunshine 使用的端口即可在远端 Moonlight 上使用公网串流。

公网在网关等路由设备上

同样也是很简单的方式,只需要在网关中将 Sunshine 使用的端口转发到运行 Sunshine 的设备上即可在远端 Moonlight 上使用公网串流。

  1. 登录路由器管理页面
    • 访问你的路由器管理界面,在浏览器中输入路由器的 IP 地址(查看路由器背面写的IP地址(形如:192.168.1.1 ),或打开cmd,输入 ipconfig,网关一栏的IP便是你的路由器IP)。
  2. 配置端口转发
    • 在路由器管理界面中,找到 “端口转发”(Port Forwarding)或类似的设置项。
    • 为 Sunshine 服务器配置端口转发,将外部请求的端口(通常是 47984)转发到 Sunshine 服务器的内网 IP 地址和端口上。
    • 如果你使用了多个端口(如备用端口 47985、视频流端口 47989、音频流端口 47990 等),也需要进行相应的端口转发。
      • 端口转发设置
        • 外部端口:47984
        • 内部 IP:Sunshine 服务器的局域网 IP 地址
        • 内部端口:47984(或你设置的其他端口)
        • 协议:TCP/UDP(根据需求,通常设置为 TCP)

2.无公网的情况

相信这也是大多数读者的情况

方案一:内网穿透

可以任意选择市面上有的内网穿透服务或自行搭建,并将所有使用的端口进行穿透,阿猫在这里不做推荐,以免广告嫌疑,自行搭建可以参考这篇文章:

注意:此方案的延迟为内网穿透服务器到两设备的延迟和,建议选择离设备所在地区近的节点

方案二:VPN(虚拟专用网络)

在 Sunshine 服务器与 Moonlight 客户端上安装 VPN:你可以使用 OpenVPN、WireGuard 或其他 VPN 软件在 Sunshine 服务器上设置 VPN。阿猫推荐使用WireGuard,安装教程参考站内文章,文章内包括WireGuard服务器搭建和客户端配置文件教程,WireGuard的安装包官网下载链接如下:

https://www.wireguard.com/install

这个网站在国内大概率被墙,阿猫在下方附上离线安装包,选择适合系统的版本

蓝奏网盘 密码:8fpq

一旦 VPN 成功连接,远程设备就像在同一个局域网内一样,可以直接通过局域网 IP 地址访问 Sunshine。

注意:此方案的延迟为中转服务器到两设备的延迟和,建议选择离设备所在地区近的公网服务器作为 WireGuard 的转发服务器

Sunshine 所使用的主要端口及其用途

1. 主端口 (默认端口:47984)

  • 用途:这是 Sunshine 的主端口,主要用于客户端(如 Moonlight)与 Sunshine 服务器之间建立连接。客户端通过此端口进行连接并请求流媒体内容。
  • 协议:TCP/UDP(通常使用 TCP,确保数据传输的可靠性)
  • 描述:当你在 Moonlight 或其他客户端输入 Sunshine 服务器的 IP 地址时,它会连接到该端口,以建立流媒体传输会话。所有的客户端请求和响应都会通过这个端口进行交互。

2. 备用端口(默认端口:47985)

  • 用途:这是一个备用端口,用于客户端和 Sunshine 之间的通信,特别是在主端口出现问题或需要额外的传输通道时。
  • 协议:TCP/UDP
  • 描述:类似于主端口,这个端口用于进行数据传输和用户交互,确保如果主端口被防火墙或其他网络设备拦截时,客户端仍然可以通过备用端口进行连接。

3. 视频流端口(默认端口:47989)

  • 用途:此端口用于 Sunshine 将压缩后的屏幕图像(视频流)传输到客户端。通过该端口,Sunshine 发送编码后的图像和视频数据流。
  • 协议:TCP
  • 描述:这是视频流传输的主要端口,客户端通过该端口接收 Sunshine 编码后的视频数据流。该端口保证了视频内容的实时传输和显示。

4. 音频流端口(默认端口:47990)

  • 用途:用于传输音频流,将计算机的音频数据(如游戏声音、系统声音)传输到客户端。
  • 协议:UDP
  • 描述:该端口保证音频流的低延迟传输。因为音频通常不需要像视频流那样高带宽,且延迟要求相对较低,因此使用 UDP 协议进行传输,减少延迟。

5. 输入流端口(默认端口:47991)

  • 用途:该端口用于传输客户端的用户输入(例如鼠标、键盘、控制器等)的数据。
  • 协议:TCP/UDP
  • 描述:当用户在客户端上进行操作时,这些操作(如鼠标点击、键盘输入、控制器按键)会通过该端口传输回 Sunshine 服务器,使得游戏或应用程序可以响应用户的输入。

6. NAT穿透端口(默认端口:47998)

  • 用途:如果 Sunshine 服务器在 NAT 后面(例如使用路由器连接互联网),这个端口用于 NAT 穿透,确保客户端能够通过互联网访问 Sunshine 服务器。
  • 协议:UDP
  • 描述:当 Sunshine 和客户端之间存在 NAT 或防火墙时,NAT 穿透协议帮助它们直接建立连接,而不需要手动配置端口转发。

7. WebSocket 端口(默认端口:47992)

  • 用途:此端口用于通过 WebSocket 协议与客户端保持通信,主要用于实现实时的用户交互和状态更新。
  • 协议:TCP
  • 描述:WebSocket 协议可以实现低延迟、双向通信,确保客户端和服务器之间的实时互动(例如,控制输入和状态更新)。

8. 自定义端口

  • Sunshine 还允许用户根据需要修改某些端口。如果默认端口在某些环境下发生冲突,用户可以在配置文件中进行自定义配置。

总结

  • 47984:主端口,用于 Sunshine 服务器与客户端的连接,通常使用 TCP 协议。
  • 47985:备用端口,用于提供额外的通信通道,通常使用 TCP/UDP 协议。
  • 47989:视频流端口,用于视频数据传输,使用 TCP 协议。
  • 47990:音频流端口,用于音频数据传输,使用 UDP 协议。
  • 47991:输入流端口,用于客户端输入数据的传输,使用 TCP/UDP 协议。
  • 47998:NAT 穿透端口,帮助客户端穿越 NAT,使用 UDP 协议。
  • 47992:WebSocket 端口,用于实时交互,使用 TCP 协议。

其他建议和注意事项

带宽要求:

为了获得流畅的体验,确保你的网络带宽足够高。对于 1080p 60FPS 的流媒体,推荐的上传速度为至少 10Mbps。

低延迟优化:

若遇到延迟问题,可以尝试调整 Sunshine 和 Moonlight 的设置,特别是帧率、分辨率和码率设置。

最后

文章大概已经很详细了,如果有什么不明白的可以在评论区提问或者发送邮件至 Pavilion_Cat@outlook.com,更多支持可点击这里查看

文章如果有错,或者有补充内容,欢迎在评论区指出

码字不易,喜欢文章可以多多分享

待解决问题:受 DRM 保护的画面无法被串流,例如腾讯视频播放

作者:Pavilion_Cat
本文链接:https://blog.pavilioncat.com/ultimate-sunshine-moonlight-streaming-setup-guide.html
免责声明:本文内容仅供参考,不代表任何法律或专业建议。
作品采用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权,若想转载,请标明来源
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇