Sunshine 实战:把 PC 画面串到任意屏幕的 4 个关键动作
【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine
周末躺在沙发想在大屏上打游戏,主机却搁在书房,电视只能黑屏干瞪眼。Sunshine 就是干这个的:一个自托管游戏串流主机,装在游戏 PC 上,把画面硬件编码后推给电视、平板、手机里的 Moonlight 客户端。开源免费,无订阅费。
| 关键信息 | 说明 |
|---|---|
| 主机平台 | Windows、Linux、macOS(实验性)、FreeBSD |
| 串流客户端 | Moonlight,可装在电视、平板、手机、PC 等任意设备 |
| 编码方案 | NVENC / QuickSync / AMF / VAAPI / VideoToolbox,CPU 软编兜底 |
| 管理入口 | 浏览器 Web UI,默认 https://localhost:47990 |
| 费用 | 开源免费,无订阅 |
原理速览:它凭什么做到
数据通路分三段:抓取、编码、发送。抓取走各平台原生通道——Windows 用 DXGI 或 WGC,Linux 用 KMS、X11 或 NvFBC,macOS 用 ScreenCaptureKit。然后是 GPU 专用编码单元把画面压成视频流,这一步最关键:硬件编码把 CPU 从压缩里解放出来,是串流不卡的核心原因。最后压缩流经网络送到 Moonlight 客户端,在另一块屏上解码播放。说白了,就是把 GPU 编码结果装进信封,沿网线寄给另一块屏幕。
延迟表现还取决于发送方式:Sunshine 每 16ms 突发发一帧(对应 60fps),中间网络设备缓冲不够就会丢数据,这也是后文排障里丢包问题的根源。编码方案按显卡自动选,在 Web UI 的 AudioVideo 页签可切换,各平台支持矩阵如下:
| 编码 API | 显卡 | Linux | macOS | Windows |
|---|---|---|---|---|
| NVENC | NVIDIA | 支持 | — | 支持 |
| QuickSync | Intel | — | — | 支持 |
| AMF | AMD | — | — | 支持 |
| VAAPI | AMD / Intel / NVIDIA | 支持 | — | — |
| VideoToolbox | Apple / Intel | — | 支持 | — |
| Vulkan Video | AMD / Intel / NVIDIA | 实验性 | — | — |
| 软编(CPU) | 任意 | 支持 | 支持 | 支持 |
核心实现分散在 src/nvenc/(NVENC)和 src/platform/linux/(VAAPI、Vulkan Video 等)。没有独显就选软编,能跑,但 1080p 下 CPU 占用明显上升。
五分钟跑通最短闭环
第 1 步:安装。按你的系统选一条:
# Windows winget install LizardByte.Sunshine # Linux(Flatpak) flatpak install --system flathub dev.lizardbyte.app.Sunshine # macOS brew tap LizardByte/homebrew && brew install sunshine完整安装包列表(AppImage、.deb、.rpm、FreeBSD pkg 等)见 docs/getting_started.md。卡住了:翻到文末"继续深挖"。
第 2 步:启动并打开 Web UI。Linux 上直接起用户服务,否则在终端跑sunshine:
systemctl --user --now enable app-dev.lizardbyte.app.Sunshine浏览器打开 https://localhost:47990,"不安全网站"的警告来自自签名证书,忽略即可。首次启动会要求你创建用户名和密码——当场记下来,忘了只能重置。47990 打不开直接查"踩坑速查"。
第 3 步:配对客户端。Moonlight 里添加这台主机,客户端会显示一个 PIN。登录 Web UI,在顶部导航的 PIN 页输入该 PIN,给设备起个名字,配对完成。完整配对流程见 docs/getting_started.md 的 Configuration 章节。
三个值得知道的点
应用管理:给每个游戏一个启动入口
Web UI 里的应用列表就是 Moonlight 客户端看到的入口。每个应用有名称、可执行文件、工作目录,还能挂prep-cmd(启动前执行的命令)。默认列表来自 src_assets/linux/assets/apps.json,其中 Steam 大屏的写法:
{ "name": "Steam Big Picture", "detached": ["setsid steam steam://open/bigpicture"], "prep-cmd": [ { "do": "", "undo": "setsid steam steam://close/bigpicture" } ], "image-path": "steam.png" }三条行为规则要知道:启动新应用会先终止正在串流的应用;prep-cmd失败则放弃启动;应用退出,串流随之结束。客厅里想一键拉起某个游戏或 Steam 大屏时用得上。
虚拟手柄:客户端的手柄"变"成主机的手柄
你在 Moonlight 端插着 Xbox、DualSense 或 Switch Pro,Sunshine 会在主机上虚拟出同类型手柄传给游戏,游戏看到的就是它。Windows 和 Linux 支持最全:通用、DS4、DS5、Switch Pro、Xbox 360/One/Series 全支持;macOS 暂不支持。Windows 主机可另装 Virtual HID Driver 解锁完整特性,Linux 依赖 uinput,实现见 src/platform/virtualhid_input.cpp 和 src/platform/linux/input/。不想往 PC 上插手柄、直接用电视那头的手柄玩时用得上。
HDR 串流:Windows 正式支持,Linux 实验性
主机开了 HDR、客户端也开了 HDR,串流才真正带 HDR;客户端不开就按 SDR 解码,主机还是 HDR 状态时画面直接过曝。Linux 端要求苛刻:Intel/AMD 显卡 + VAAPI 的 HEVC Main 10 或 AV1 10-bit 编码 + KMS 捕获后端(NvFBC 和 X11 不支持 HDR)+ 支持 HDR 渲染的合成器(Gamescope 或 KDE Plasma 6)。完整要求见 docs/getting_started.md 的 HDR Support 章节。想在大电视上看 HDR 游戏、保住高光细节时用得上。
一个完整工作流
场景:书房里一台老游戏 PC 没接显示器,你要把 Steam 大屏直接串到客厅电视。
- 先把机器拉起来。人在别处,SSH 登进主机带 X11 启动 Sunshine:
ssh <user>@<主机IP> 'export DISPLAY=:0; sunshine'。NVIDIA 显卡走 NvFBC 捕获,不接显示器时显卡可能不输出,用 HDMI 欺骗器或 EDID 模拟器补上。 - 接着把画质调到匹配电视。打开 Web UI 的 AudioVideo 页签,分辨率设成电视原生值(如 3840×2160),码率按你的网络情况调;顺手在导航栏下拉里选个主题。
- 然后确认应用列表。Applications 页签里找 "Steam Big Picture",默认就自带;没有就按上一节的 apps.json 结构手动添加。
- 最后配对开播。电视上的 Moonlight 添加主机,回到 Web UI 的 PIN 页完成配对,选 "Steam Big Picture" 启动。画面出来,大屏菜单就位。
应用管理界面长这样:
踩坑速查 🔧
忘了 Web UI 账号密码,进不去后台根因:凭据只存本地,无找回入口;处置:停掉 Sunshine,跑sunshine --creds {新用户名} {新密码}重置(Flatpak 用flatpak run --command=sunshine前缀)
浏览器访问 47990 打不开根因:防火墙挡了端口,或服务没在跑;处置:先查服务状态,再放行 47990 端口
画面卡顿、丢包根因:主机 2.5Gb 有线,客户端只有 1Gb 或 Wi-Fi;处置:iPerf3 测出瓶颈(丢包 <5%、抖动 <1ms 才算达标),降速主机网卡或升级到 0.23.1 之后版本
Linux 上连上后键鼠、手柄没反应根因:运行 Sunshine 的用户没有 uinput 权限;处置:把用户加进input组并重新登录(FreeBSD 用pw groupmod input -m $USER)
主机开了 HDR,串出来的画面发白过曝根因:客户端没开 HDR,流按 SDR 解码;处置:Moonlight 设置里启用 HDR,Linux 主机改用 KMS 捕获后端
都解决不了,先打开 Web UI 的 Troubleshooting 页签,每条 warning/error 都能点开看细节,按线索逐条过。
继续深挖
- docs/getting_started.md — 各平台安装方式、首次设置、配对流程,以及快捷键(Ctrl+Alt+Shift+N 隐藏光标、Ctrl+Alt+Shift+F1/F12 切显示器)
- docs/configuration.md — port、locale、编码器、音频设备,全部配置项逐项说明
- docs/troubleshooting.md — 凭据重置、iPerf3 网络测试(50M 反向 UDP)、丢包处理
- docs/performance_tuning.md — 按你的网络情况选码率与分辨率
- src/platform/ — 各平台屏幕捕获与编码实现(KMS、NvFBC、WGC、VAAPI、ScreenCaptureKit 等)
- tests/ — 单元测试与集成测试,想搞懂内部行为从这里入手
【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考