1. 为什么我最终选择了 Sunshine 加 Moonlight 这套自托管串流方案
1.1 从被串流软件折腾到自建主机的心路历程
最早接触游戏串流,我用的是显卡厂商自带的那套方案。刚开始确实省心,装完驱动、打开开关、客户端扫码就能连上,延迟也还能接受。但后来问题一个接一个冒出来:驱动更新之后串流功能时好时坏,有时候干脆连不上;客户端只支持特定几个平台,我想在客厅的电视盒子或者旧笔记本上跑都费劲;最要命的是画质和码率几乎没法细调,网络稍微波动一下就糊成一片。折腾了几次之后我就想,能不能找一套完全跑在自己机器上、不依赖厂商生态的方案。
后来在几个技术社区里看到有人推荐 Sunshine 加 Moonlight 的组合,我抱着试一试的心态搭了一套,结果用下来就再也没换回去。Sunshine 是跑在主机端的串流服务端,负责采集画面、编码、推流;Moonlight 是客户端,负责接收、解码、显示。两者都是开源项目,协议兼容性做得很好,而且几乎覆盖了所有主流平台——Windows、Linux、macOS 主机端都能跑,客户端从手机、平板到电视盒子、树莓派都有对应版本。最关键的是,所有参数都摊在你面前,码率、编码器、分辨率、帧率、音频通道,想怎么调就怎么调,这种掌控感是闭源方案给不了的。
这套方案适合什么人?我觉得有三类。第一类是家里有台性能不错的台式机,想躺在床上用平板或者客厅电视接着玩的;第二类是想把旧电脑、旧手机利用起来当串流终端的;第三类就是像我这样,对画质和延迟有要求、又不想被厂商生态绑死的折腾党。整个搭建过程如果顺利,半小时以内能跑通,但中间有几个坑点,我下面会一个个拆开讲。
1.2 Sunshine 与 Moonlight 各自扮演什么角色
很多人一开始会搞混这两个东西的分工,我用一个生活化的类比来解释。Sunshine 就像是家里的自来水厂,它负责把水(画面和声音)处理好、加压,然后通过管道(网络)送出去;Moonlight 则是你家里的水龙头,负责把水接出来、调节冷热(画质和音量),最后呈现给你。水厂和水龙头之间靠一套标准协议通信,这套协议就是 NVIDIA GameStream 协议的开源实现。
具体到技术层面,Sunshine 在主机端做的事情包括:调用系统的图形接口抓取屏幕或指定窗口的画面,交给 GPU 或 CPU 编码成 H.264、HEVC 或者 AV1 码流,再通过 RTSP 和 RTP 把码流打包发送;同时它还要处理输入事件的反向传输,也就是把客户端的手柄、键鼠操作传回主机。Moonlight 在客户端做的事情相对简单:建立连接、协商参数、接收码流、硬件解码、渲染显示,再把本地输入采集后发回去。
这里有个关键点值得展开说:编码这一步是整套方案里最吃性能的环节。如果你用的是带硬件编码器的显卡,比如支持 NVENC 的 N 卡或者支持 AMF 的 A 卡,编码开销几乎可以忽略,主机该干嘛干嘛;但如果只能走 CPU 软编,那主机在串流时基本就没法同时干别的重活了。所以选主机的时候,显卡的编码能力比游戏性能本身更值得关注。
1.3 自托管方案相比商业串流的真实优势
商业串流方案的优势是开箱即用,但代价是你得接受它的规则。我总结下来,自托管这套方案的核心优势集中在四个方面。
第一是参数完全可控。码率可以从 1Mbps 一路拉到 150Mbps,分辨率支持到 4K 甚至更高,帧率能上 120fps,编码器可以在 H.264、HEVC、AV1 之间切换。网络好的时候我把码率拉到 80Mbps 走局域网,画质几乎和本地直连没区别;出门在外用移动网络,降到 10Mbps 也能凑合玩。
第二是平台覆盖广。Moonlight 客户端官方支持 Windows、macOS、Linux、Android、iOS,还有树莓派和各类电视盒子的版本。我家里一台老款安卓平板、一台装了 Linux 的迷你主机、还有客厅的电视盒子,全都能连上同一台 Sunshine 主机,这在闭源方案里几乎不可能。
第三是没有账号和云依赖。所有数据都在你自己的局域网里跑,不经过任何第三方服务器。主机和客户端配对之后,连接是点对点的,断网了照样能用(只要局域网通)。这一点对隐私敏感或者网络环境不稳定的用户特别友好。
第四是可定制和可扩展。Sunshine 支持自定义应用列表,你可以把任意程序加进去,不只是游戏。我甚至把一些需要远程操作的软件也配了进去,用平板就能控制主机上的程序。后面我还会讲怎么配置开机自启,让主机一开机串流服务就待命。
当然,自托管也有代价:初次配置需要动手,遇到问题得自己排查,没有官方客服。但只要你跟着下面的步骤走一遍,这些门槛其实都不高。
2. 搭建前的准备工作与核心概念梳理
2.1 主机端硬件与系统的选择建议
主机端是整个串流链路的核心,它的编码能力直接决定了画质上限和延迟表现。我先把选择逻辑讲清楚,再给具体建议。
显卡是重中之重。如果你用 NVIDIA 显卡,从 GTX 10 系开始就支持 NVENC 硬件编码,HEVC 编码从 10 系开始支持,AV1 编码需要 RTX 40 系及以上。AMD 显卡对应的是 AMF 编码器,从 RX 5000 系开始支持得比较好。Intel 核显的 Quick Sync 其实也很能打,尤其是 11 代以后的核显,HEVC 和 AV1 编码都支持,如果你手头是带核显的 Intel 平台,完全可以先用核显试试。
CPU 不用太强,但也不能太弱。因为编码主要交给显卡,CPU 主要负责协议处理和系统调度。四核八线程以上的现代处理器基本够用。但如果你的显卡不支持硬件编码,只能走 CPU 软编,那就得另说了——软编 1080p60 至少需要六核以上的性能,而且主机基本没法同时做别的事。
内存和网络。内存 8GB 起步,16GB 更稳妥,因为串流本身会占用一部分内存做缓冲。网络方面,主机最好走有线千兆网口,这是保证稳定低延迟的基础。如果主机只能走无线,那至少要是 Wi-Fi 6 且离路由器近,否则延迟和丢包会让你怀疑人生。
系统方面,Windows 10/11 是最省心的选择,驱动和编码器支持最完善。Linux 也能跑,Ubuntu 22.04 及以上版本我实测过,配合合适的驱动也能正常工作,但配置过程会多一些步骤,后面我会单独讲。
2.2 客户端设备的兼容性盘点
客户端的选择就灵活多了,基本上只要 Moonlight 有对应版本,设备性能过得去就行。我把常见设备类型和注意事项列一下。
| 设备类型 | 推荐程度 | 关键注意点 |
|---|---|---|
| Windows 笔记本/台式机 | 高 | 支持硬件解码,画质和延迟表现最好 |
| macOS 设备 | 高 | M 系列芯片解码能力强,Intel 机型也够用 |
| Android 手机/平板 | 高 | 建议 Android 8.0 以上,支持硬件解码 |
| iOS/iPadOS 设备 | 高 | 需要从应用商店安装,解码性能优秀 |
| 树莓派 4/5 | 中 | 需要配置硬件解码,性能有限但可用 |
| 电视盒子 | 中 | 芯片方案差异大,建议选支持 HEVC 硬解的 |
| Linux 迷你主机 | 中 | 配置稍复杂,但可控性强 |
这里有个经验:客户端的解码能力比它的 CPU 性能更重要。一台老款手机如果支持 HEVC 硬件解码,串流 1080p60 的体验可能比一台不支持硬解的新电脑还流畅。所以选客户端的时候,先查一下它的芯片支持哪些解码格式。
2.3 网络环境对串流质量的决定性影响
网络这块我要单独拎出来讲,因为太多人栽在这上面。串流对网络的要求可以概括为三个词:带宽够、延迟低、抖动小。
带宽方面,1080p60 的 H.264 码流大概需要 20-30Mbps,HEVC 因为压缩效率更高,15-20Mbps 就能达到相近画质。4K60 的话,H.264 要 60Mbps 以上,HEVC 大概 40Mbps,AV1 能压到 30Mbps 左右。所以局域网千兆是基本盘,Wi-Fi 的话至少要有稳定的 5GHz 频段。
延迟和抖动比带宽更关键。串流是实时交互,网络抖动超过 10ms 你就能感觉到操作延迟。有线连接天然占优,无线的话要确保客户端和主机在同一个路由器下,尽量避开 2.4GHz 频段和拥挤的信道。我实测下来,主机有线加客户端 Wi-Fi 6 的组合,在路由器同一房间内延迟可以控制在 10ms 以内,隔一堵墙大概 15-20ms,隔两堵墙就开始不稳定了。
提示:如果你的路由器支持 QoS 或者流量优先级设置,把主机的 IP 设为高优先级,能明显改善串流稳定性。
还有一个容易被忽略的点:MTU 和分片。有些网络环境下大包会被分片,导致延迟飙升。如果遇到莫名其妙的卡顿,可以尝试在主机和客户端都把 MTU 调小到 1400 试试。
3. Sunshine 主机端的完整安装与配置流程
3.1 Windows 平台安装 Sunshine 的详细步骤
Windows 是最好上手的平台,我以 Windows 11 为例走一遍流程。
第一步,去 Sunshine 的官方发布页面下载最新的 Windows 安装包。文件名通常形如Sunshine-Windows-Installer-x.x.x.exe,下载后双击运行。安装过程中会提示你安装一个虚拟显示驱动,这个驱动的作用是让主机在没有物理显示器连接时也能正常输出画面,强烈建议安装。安装完成后,Sunshine 会自动注册为系统服务并启动。
第二步,打开浏览器访问https://localhost:47990,这是 Sunshine 的 Web 管理界面。首次访问会要求你设置用户名和密码,这个凭据用于管理界面登录和客户端配对,务必记牢。设置完成后进入主界面,你会看到 Applications、Configuration、Troubleshooting 等几个标签页。
第三步,配置基础参数。进入 Configuration 标签,重点看这几个选项:
- Sunshine Name:主机在客户端上显示的名字,改成你容易识别的,比如
MyGamePC。 - Port:默认 47989,一般不用改,除非端口冲突。
- Encoder:编码器选择,N 卡选
nvenc,A 卡选amf,Intel 核显选quicksync,不确定就选auto。 - Adapter Name:多显卡时指定用哪块卡编码,单卡不用管。
第四步,添加应用。进入 Applications 标签,点击 Add 新建一个应用条目。Name 填应用名,比如Desktop表示串流整个桌面;Command 填要启动的程序路径,如果只想串流桌面,可以留空或者填cmd.exe。我建议至少配一个 Desktop 条目,方便随时串流整个屏幕。
第五步,配对客户端。在客户端上打开 Moonlight,它会自动搜索局域网内的 Sunshine 主机。选中你的主机后,Moonlight 会显示一个四位数的 PIN 码。回到 Sunshine 的 Web 界面,在 PIN 页面输入这个码,配对就完成了。
3.2 Linux 平台(Ubuntu)安装与自启配置
Ubuntu 上的安装稍微复杂一点,但也不难。我以 Ubuntu 22.04 为例。
首先安装依赖。Sunshine 需要一些图形和编码相关的库,执行:
sudo apt update sudo apt install -y curl wget libssl-dev libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libx11-dev libxfixes-dev libxrandr-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libdrm-dev libcap-dev libpulse-dev libopus-dev libevdev-dev libwayland-dev然后下载 Sunshine 的 Linux 安装包。官方提供.deb包,下载后执行:
sudo dpkg -i sunshine-*.deb sudo apt install -f安装完成后,Sunshine 会注册为 systemd 服务。但默认情况下它可能不会自动启动,需要手动启用:
sudo systemctl enable sunshine sudo systemctl start sunshine这里有个坑:Sunshine 在 Linux 下需要访问图形会话,如果它以系统服务方式运行,可能拿不到当前用户的显示环境。解决办法是把它配置成用户级服务。具体做法是在~/.config/systemd/user/下创建sunshine.service,内容大致如下:
[Unit] Description=Sunshine Game Streaming After=graphical-session.target [Service] ExecStart=/usr/bin/sunshine Restart=on-failure Environment=DISPLAY=:0 [Install] WantedBy=default.target然后执行systemctl --user enable sunshine && systemctl --user start sunshine。这样 Sunshine 就会跟着你的图形会话一起启动。
注意:Linux 下编码器支持取决于驱动。N 卡需要安装专有驱动并确保 NVENC 可用,A 卡需要较新的 Mesa 驱动。装完后可以在 Sunshine 日志里确认编码器是否被正确识别。
3.3 编码器与画质参数的取舍逻辑
配置 Sunshine 的时候,编码器和画质参数是最需要动脑子的部分。我把选择逻辑拆开讲。
编码器选择。优先级是:AV1 > HEVC > H.264。AV1 压缩效率最高,同画质下码率最低,但需要 RTX 40 系或同代以上的硬件支持,客户端也要能解 AV1。HEVC 是目前的甜点,压缩效率比 H.264 高 30% 左右,绝大多数现代设备都支持。H.264 兼容性最好,但同画质需要更高码率。如果你不确定客户端支持什么,先用 HEVC,不行再退到 H.264。
码率设置。这是画质和流畅度的平衡点。局域网千兆环境下,1080p60 我建议设 30-50Mbps,1440p60 设 50-80Mbps,4K60 设 80-150Mbps。如果是无线或者外网,按实际带宽的 60% 来设,留出余量应对波动。
帧率。能上 60 就别用 30,能上 120 就更好,但前提是主机能稳定输出这个帧率。如果游戏本身跑不到 60 帧,串流设 60 也没意义,反而增加编码负担。
其他参数。Video Frame Rate和Video Bitrate在 Sunshine 里是全局默认值,但 Moonlight 客户端连接时可以覆盖。FEC(前向纠错)建议开启,能提升弱网下的稳定性,代价是略微增加带宽开销。Audio部分,如果客户端支持多声道就选 5.1,否则选立体声。
我自己的配置是:HEVC 编码,1080p60,码率 40Mbps,FEC 开启。这套参数在局域网下画质几乎无损,延迟稳定在 8-12ms。
4. Moonlight 客户端的安装、配对与画质调优
4.1 各平台客户端安装要点
Moonlight 的安装比 Sunshine 简单得多,各平台基本都是一路下一步。
Windows 和 macOS 去官网下载安装包,双击安装即可。Android 在应用商店搜索 Moonlight 安装,注意认准开发者是 Moonlight Game Streaming Project。iOS 和 iPadOS 在 App Store 搜索安装,国区可能搜不到,需要切换到其他区。Linux 用户可以通过 Flatpak 或者发行版仓库安装,比如flatpak install flathub com.moonlight_stream.Moonlight。树莓派有专门的镜像和安装脚本,官方文档写得很清楚。
安装完成后第一次打开,Moonlight 会自动扫描局域网内的 Sunshine 主机。如果没扫到,可以手动添加主机 IP。选中主机后进入配对流程,前面已经讲过,输入 PIN 码即可。
4.2 配对失败与连接异常的排查思路
配对和连接是新手最容易卡住的地方,我把常见问题和排查顺序整理一下。
扫不到主机。先确认主机和客户端在同一个局域网,且没有开启 AP 隔离。然后检查主机的防火墙,Sunshine 需要放行 47984-47990 这几个端口。Windows 上可以在防火墙高级设置里添加入站规则,Linux 上用ufw allow 47984:47990/tcp和对应的 UDP 规则。
配对时 PIN 码无效。这种情况通常是主机和客户端时间不同步导致的。检查两边系统时间是否准确,时区是否一致。另外,Sunshine 的 Web 界面如果长时间没操作会登出,重新登录再输入 PIN。
连接后黑屏或者闪退。多半是编码器或者解码器不匹配。先在 Sunshine 里把编码器换成 H.264 试试,如果好了说明是 HEVC 兼容性问题。客户端这边也可以在设置里强制指定解码器。
连接成功但延迟很高。先看是不是走了无线,能插网线就插网线。然后检查主机是不是在跑其他吃性能的任务。最后看码率是不是设太高了,降一半试试。
提示:Sunshine 的 Troubleshooting 标签页里有详细的日志,遇到问题先看日志,大部分错误信息都能直接定位原因。
4.3 画质与延迟的平衡调优实战
Moonlight 客户端的设置项不多,但每一项都影响体验。我按重要性排序讲。
分辨率。客户端设置里的分辨率要和主机输出匹配。如果主机是 1080p 显示器,客户端设 4K 也没用,反而增加解码负担。正确做法是让主机输出分辨率等于或高于客户端需求,然后在 Moonlight 里选对应分辨率。
帧率。和分辨率同理,选主机能稳定输出的帧率。60fps 是甜点,120fps 适合竞技类游戏,但需要主机和客户端都支持高刷。
码率。Moonlight 里可以覆盖 Sunshine 的默认码率。局域网下我一般设 40-60Mbps,外网按带宽设。有个技巧:先设高一点,如果出现卡顿再逐步降,找到稳定运行的临界值。
V-Sync 和帧同步。V-Sync 开启能消除画面撕裂,但会增加一点延迟。如果玩竞技游戏,可以关掉 V-Sync 换取更低延迟。Moonlight 还有Frame Pacing选项,能改善帧生成时间的均匀性,建议开启。
HDR。如果主机和客户端都支持 HDR,开启后画质提升明显,但会占用更多带宽。SDR 显示器就别开了,颜色会发灰。
我实测下来,1080p60、40Mbps、HEVC、V-Sync 开启这套组合,在千兆局域网下延迟约 10ms,画质和本地直连几乎看不出区别。如果换成 4K60、100Mbps,延迟会升到 15-20ms,但画质提升对大多数游戏来说感知不强,所以我一般还是用 1080p。
5. 常见问题排查与长期使用经验
5.1 串流过程中的典型故障速查
用了大半年,我踩过的坑不算少,整理成一张速查表,遇到问题可以对照排查。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 画面卡顿但声音正常 | 网络带宽不足或抖动大 | 降码率,检查网络,优先有线 |
| 声音卡顿但画面正常 | 音频缓冲设置问题 | 调整 Sunshine 音频缓冲,或换音频通道 |
| 手柄无响应 | 输入设备未正确映射 | 检查 Sunshine 输入设置,重新配对 |
| 画面偏色或发灰 | HDR/SDR 不匹配 | 统一主机和客户端的 HDR 设置 |
| 连接后主机黑屏 | 虚拟显示驱动问题 | 重装虚拟显示驱动,或接一个物理显示器 |
| 延迟突然飙升 | 主机后台任务抢占资源 | 关闭后台下载、更新等任务 |
| 频繁断连 | 无线信号不稳定 | 换有线,或调整路由器信道 |
这张表覆盖了我遇到过的九成问题。剩下的一成,基本都能在 Sunshine 日志里找到线索。
5.2 提升串流稳定性的几个实操技巧
除了基础配置,还有几个技巧能明显提升体验,都是我反复试出来的。
固定主机 IP。在路由器里给主机分配静态 IP,避免 DHCP 续约导致 IP 变化,客户端就不用反复重新配对。
关闭主机的自动更新和后台同步。Windows 的自动更新、OneDrive 同步、Steam 后台下载,这些都会在你不注意的时候抢占带宽和 CPU,导致串流卡顿。串流前手动关掉,或者设置成手动更新。
给 Sunshine 进程设高优先级。在任务管理器里把 Sunshine 相关进程的优先级设为“高”,能减少被其他任务抢占的概率。
客户端开启硬件解码。Moonlight 默认会尝试硬件解码,但有些设备需要手动开启。在设置里确认Decoder选的是硬件解码器,比如Hardware或具体的芯片型号。
定期更新 Sunshine 和 Moonlight。这两个项目更新挺频繁,新版本经常修复兼容性问题和提升性能。但注意别在串流前更新,更新完先本地测试一下再连客户端。
5.3 关于自托管串流的一些个人体会
搭这套东西之前,我以为最大的难点是技术配置,实际用下来发现,真正的门槛在于理解整个链路的瓶颈在哪。刚开始我总以为是软件问题,折腾了半天编码器设置,最后发现是路由器无线信号不稳。后来我养成了一个习惯:遇到问题先分层排查——网络层、编码层、解码层、显示层,一层层往下查,基本都能定位到根因。
另一个体会是,不要追求极致参数。我一开始非要把码率拉到 100Mbps 以上,结果网络稍微波动就卡。后来降到 40Mbps,画质肉眼几乎没差别,稳定性却好了很多。串流这件事,稳定比极限更重要。
最后说个扩展方向。Sunshine 的应用列表其实可以玩出很多花样,不只是游戏。我把一些需要长时间运行的任务也配了进去,用平板就能监控和操作。还有人用它做远程桌面、远程剪辑,思路都是一样的。这套方案的上限,取决于你怎么用它。