本文写了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:
- 访问 Sunshine 的 GitHub 页面。
- 下载适用于你操作系统的安装包(Windows/Linux)。
下载最新的发行版,注意要选择 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等浏览器的记住密码,阿猫有被坑过,如果忘记密码,请移步后文)
- 选择你要流式传输的应用或游戏:
- Sunshine 默认会识别并列出本机安装的游戏和应用程序。
- 你可以选择某个特定的程序来进行流媒体传输。
- 启用硬件加速:
- 在 Sunshine 设置中,启用硬件加速以减少延迟并提高性能。大多数现代显卡(如 NVIDIA 和 AMD)都支持硬件编码。
- 如果你的显卡支持 NVIDIA 的 NVENC 或 AMD 的 VCE,可以在 Sunshine 的设置中启用它们。
- 设置流媒体选项:
- 在 Sunshine 设置中,可以设置编码类型(H.264 或 H.265),码率(建议设置为 10Mbps 或更高),以及音频采样率(例如 48 kHz)。
- 配置网络:
- 确保你的防火墙允许 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
格式),下载并安装。
- 进入页面后,找到适用于 Windows 的安装包(通常是
Linux 安装包
- 下载链接:Moonlight for Linux
- 进入页面后,你可以找到适用于 Linux 的安装包(通常是
.deb
或.rpm
格式),选择适合你的发行版进行下载。 - 另外,你也可以从源代码自行编译安装。
- 进入页面后,你可以找到适用于 Linux 的安装包(通常是
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 上使用公网串流。
- 登录路由器管理页面:
- 访问你的路由器管理界面,在浏览器中输入路由器的 IP 地址(查看路由器背面写的IP地址(形如:
192.168.1.1
),或打开cmd,输入ipconfig
,网关一栏的IP便是你的路由器IP)。
- 访问你的路由器管理界面,在浏览器中输入路由器的 IP 地址(查看路由器背面写的IP地址(形如:
- 配置端口转发:
- 在路由器管理界面中,找到 “端口转发”(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 保护的画面无法被串流,例如腾讯视频播放