1. 串流方案选型背后的真实需求
1.1 为什么是这三个组件的组合
先把这三个东西各自是干什么的说清楚。Sunshine 是运行在主机端的串流服务端,负责采集画面、编码、推流;Moonlight 是客户端,负责接收、解码、显示,同时把键鼠手柄的输入回传;ParsecVDisplay 是一个虚拟显示器驱动,它能在没有物理显示器或者物理显示器被占用的情况下,凭空造出一块“假屏幕”给系统用。
单看每一个都不稀奇,但把它们串起来,解决的是一个非常具体的痛点:主机放在客厅或者机房,人坐在另一个房间甚至另一栋楼里,用轻薄本、平板、电视盒子去操作这台主机,而且要求画面流畅、延迟低、分辨率刷新率可调、主机端还能保持一个“干净的桌面”不被干扰。
我最早接触这套组合是因为一个很实际的需求:主力机放在书房,但晚上想在卧室用笔记本打游戏、剪片子。直接用 Windows 自带的远程桌面?延迟高、色彩差、不支持手柄、刷新率锁死。用商业串流软件?要么收费,要么画质压缩得厉害,要么对 AMD 显卡支持一般。折腾了一圈,最后落到了 Sunshine + Moonlight 这套开源组合上,再配合 ParsecVDisplay 解决“无头运行”的问题。
这三个组件的分工可以用一个生活化的类比来理解:Sunshine 是电视台的导播和发射塔,负责把节目信号编码发出去;Moonlight 是你家的电视机,负责接收和解码;ParsecVDisplay 则是一块“虚拟的幕布”,当没有真实幕布(物理显示器)的时候,导播依然有地方可以“投放”画面。
1.2 适合哪些人折腾这套方案
这套方案不是给所有人准备的。如果你只是偶尔远程看一下文件、回个消息,Windows 自带的远程桌面或者一些轻量工具就够了,没必要上串流。但如果你符合下面几种情况,这套组合的价值就非常明显:
- 游戏玩家:想在卧室、客厅、甚至外地用另一台设备玩主机上的 3A 大作,要求低延迟和高帧率。
- 内容创作者:主机性能强但放在固定位置,想在别的房间用轻薄本调用主机的算力做渲染、剪辑。
- 多设备用户:家里有电视盒子、平板、旧笔记本,想物尽其用,把它们变成主机的“瘦客户端”。
- 无头主机用户:主机塞在机柜里不接显示器,或者显示器接口被其他设备占用,需要虚拟显示器来维持正常的分辨率和刷新率输出。
这里要特别提一句 AMD 处理器的用户。网上搜“amd处理器选择哪个sunshine安装包”的人很多,原因是 Sunshine 的 Windows 安装包在历史上对 AMD 显卡的编码器支持有过一些差异。实际上 Sunshine 的安装包本身并不区分 CPU 品牌,它区分的是显卡编码器——NVIDIA 用 NVENC,AMD 用 AMF,Intel 用 QuickSync。所以选安装包看的是你的显卡,不是 CPU。但 AMD 平台确实有一些额外的注意事项,后面会专门讲。
1.3 整体架构长什么样
在动手之前,脑子里要有一张清晰的图。整套系统的数据流是这样的:
主机端(运行 Sunshine)采集屏幕画面 → 硬件编码器压缩 → 通过网络发送 → 客户端(运行 Moonlight)接收 → 硬件解码 → 显示在屏幕上。同时,客户端的键鼠手柄输入反向传回主机。
ParsecVDisplay 的位置比较特殊,它插在“采集屏幕画面”这一步之前。当主机没有物理显示器时,Windows 会默认用一个很低的分辨率(比如 1024x768)和很低的刷新率来输出,甚至某些显卡驱动在没有显示器连接时会直接停止输出。ParsecVDisplay 就是在这个时候顶上去,让系统以为有一块真实的显示器接着,从而维持你设定的分辨率和刷新率。
理解了这张图,后面所有的配置和排错都有了依据。任何一个环节出问题,你都能快速定位是采集、编码、网络、解码还是显示的问题。
2. 主机端环境搭建与 Sunshine 配置细节
2.1 安装包选择与 AMD 平台的坑
Sunshine 的官方发布渠道会提供几个不同的安装包,常见的有标准安装版(.exe)和便携版(.zip)。对于绝大多数 Windows 用户,直接下标准安装版就行,它会自动注册服务、添加防火墙规则、创建开始菜单项。
但 AMD 用户要注意几个点。第一,确保你的显卡驱动是较新的版本,AMD 的 AMF 编码器在旧驱动上bug比较多,尤其是 H.264 和 HEVC 的码率控制。第二,Sunshine 在检测编码器时,如果同时存在核显和独显(比如 AMD APU 加独立显卡),可能会选错编码器。这时候需要手动在 Sunshine 的配置文件里指定用哪一个。
配置文件的位置在安装目录下的config/sunshine.conf,或者通过 Web 管理界面修改。关键参数是encoder,可以显式指定为amf、nvenc、software等。我遇到过一台机器,Ryzen 5 5600G 加 RX 6600,Sunshine 默认选了核显的 AMF,结果编码延迟高、画质差,手动改成独显的 AMF 之后立刻正常。
提示:如果你不确定当前用的是哪个编码器,可以在 Sunshine 的日志里搜索 “encoder” 关键字,它会明确告诉你初始化了哪一个。
另外,网上有人问“阿西西moonlight”是什么,这其实是社区里对某个特定版本或某个教程作者的称呼,并不是官方分支。Moonlight 的官方客户端就叫 Moonlight,有 Qt 版和旧版之分。所谓“moonlight qt”指的就是基于 Qt 框架重写的新版客户端,界面更现代、维护更活跃,建议优先用这个版本。
2.2 虚拟显示器驱动的安装与验证
ParsecVDisplay 的安装相对独立。它本质上是一个虚拟显示适配器驱动,安装之后会在设备管理器里多出一个显示适配器。安装步骤不复杂,但有几个细节决定了它能不能正常工作。
第一步,下载对应你系统架构的驱动包(现在基本都是 x64)。第二步,以管理员身份运行安装程序,安装过程中屏幕可能会闪几下,这是正常的,因为系统在加载新的显示适配器。第三步,安装完成后重启一次,让驱动完全生效。
重启之后,右键桌面进入“显示设置”,你应该能看到多出来一块显示器。如果没看到,去设备管理器里检查“显示适配器”下面有没有带黄色感叹号的设备。有的话说明驱动签名或者兼容性有问题,需要检查系统版本和驱动版本是否匹配。
验证虚拟显示器是否真正生效,最直接的方法是看它的分辨率和刷新率能不能调整。在显示设置里选中那块虚拟显示器,如果它能提供 1920x1080、2560x1440 甚至 3840x2160 的分辨率选项,并且刷新率能上到 60Hz、120Hz 甚至更高,说明驱动工作正常。如果只有 1024x768 且刷新率锁在 60Hz 以下,那多半是驱动没加载成功。
这里有个经验:ParsecVDisplay 创建的虚拟显示器,其支持的分辨率和刷新率列表是可以在驱动配置里自定义的。默认列表可能不包含你想要的某些组合,比如 3440x1440 带鱼屏或者 165Hz 高刷。这时候需要编辑驱动的配置文件,手动添加你需要的模式。具体做法是找到驱动安装目录下的配置文件,按照已有格式添加一行分辨率加刷新率的组合,然后重启驱动服务。
2.3 Sunshine 的 Web 管理界面初探
Sunshine 安装好之后,会默认在本机的 47990 端口起一个 Web 管理界面。在主机上打开浏览器,访问https://localhost:47990就能进入。第一次访问会要求设置用户名和密码,这个凭据是给管理界面用的,和后面 Moonlight 配对用的 PIN 是两回事,别搞混。
进入管理界面后,你会看到几个主要区域:Application(应用管理)、Configuration(配置)、Troubleshooting(排错)。Application 区域是核心,它决定了 Moonlight 客户端能看到哪些“应用”可以启动。默认会有一个 “Desktop” 条目,意思是串流整个桌面。你可以添加更多条目,比如直接启动 Steam 大屏模式、直接启动某个游戏、直接启动某个生产力软件。
添加应用的时候,有几个字段需要填:Name(显示名称)、Command(启动命令)、Working Directory(工作目录)。对于游戏,Command 通常填游戏的 exe 路径或者 Steam 的启动链接。这里有个技巧:如果你想让串流启动后直接进入某个游戏且不显示桌面,可以把 Command 设成游戏的启动器,并勾选 “Wait for the process to exit” 之类的选项(不同版本叫法略有差异),这样 Sunshine 会等游戏进程结束后才停止串流。
Configuration 区域里参数很多,但真正影响体验的就那么几个。下面用表格梳理一下最关键的参数和推荐值。
| 参数名 | 作用 | 推荐值 | 说明 |
|---|---|---|---|
| encoder | 指定硬件编码器 | amf / nvenc / qsv | 根据显卡品牌选,AMD 选 amf |
| bitrate | 视频码率 | 20000-50000 Kbps | 局域网可拉高,公网视上行带宽定 |
| fps | 帧率 | 60 / 120 | 和虚拟显示器刷新率保持一致 |
| resolution | 输出分辨率 | 1920x1080 或更高 | 要和虚拟显示器支持的模式匹配 |
| hevc_mode | HEVC 编码模式 | 1 或 2 | 1 表示优先 HEVC,画质更好 |
| audio_sink | 音频输出设备 | 按需选择 | 无头主机要选虚拟声卡或保持默认 |
这张表里的参数不是孤立的,它们之间有联动关系。比如你把 fps 设成 120,但虚拟显示器只支持 60Hz,那实际输出还是 60 帧,多出来的设置没意义。再比如 bitrate 设得很高,但网络上行带宽不够,结果就是卡顿和花屏。所以调参的时候要通盘考虑。
2.4 音频的坑:无头主机的无声问题
无头主机(不接物理显示器)还有一个隐蔽的坑:音频。Windows 在没有音频输出设备的时候,声音系统可能不工作,导致串流过去只有画面没有声音。ParsecVDisplay 只解决了显示问题,音频需要另外处理。
解决办法是装一个虚拟声卡驱动,让系统始终认为有一个音频输出设备存在。常见的虚拟声卡有 VB-Audio Virtual Cable 等。装好之后,在 Sunshine 的配置里把audio_sink指向这个虚拟声卡,同时在 Windows 声音设置里把默认播放设备也设成它。这样声音就会先送到虚拟声卡,再被 Sunshine 采集编码发出去。
我踩过的坑是:一开始只装了 ParsecVDisplay,画面正常但死活没声音。排查了半天以为是 Sunshine 的音频采集有问题,后来才发现是系统根本没有可用的音频输出设备,Sunshine 无从采集。装上虚拟声卡之后问题立刻解决。这个经验说明,无头主机的“无头”不只是没有显示器,还包括没有声卡,两个都要用虚拟设备补上。
3. 客户端配置与网络调优实战
3.1 Moonlight Qt 客户端的安装与配对
客户端这边,Moonlight Qt 是目前最推荐的选择。它支持 Windows、macOS、Linux、Android、iOS 以及各种嵌入式平台,界面统一,更新频繁。下载对应平台的安装包,安装过程基本一路下一步。
安装完成后打开 Moonlight,它会自动在局域网里搜索运行 Sunshine 的主机。如果搜不到,可以手动添加主机的 IP 地址。添加之后,客户端会显示一个四位数的 PIN 码,同时主机端的 Sunshine 管理界面会弹出配对请求,你在主机端输入这个 PIN 码确认,配对就完成了。
配对这一步看似简单,但有几个常见问题。第一,如果主机和客户端不在同一个网段,自动搜索是搜不到的,必须手动加 IP。第二,如果主机开了防火墙,47989、47990、48010 这几个端口要放行。Sunshine 安装时通常会自动加规则,但如果你后来改过网络配置或者用了第三方防火墙,规则可能失效。第三,配对用的 PIN 码是每次配对时随机生成的,不是固定密码,所以不用担心泄露问题,但每次重新配对都要重新输入。
配对成功后,Moonlight 主界面会列出主机上配置好的应用条目。点进去就能开始串流。第一次串流建议先跑一下,看看默认设置下的延迟和画质,然后再针对性调整。
3.2 网络环境对串流质量的决定性影响
串流这东西,网络质量的重要性甚至超过主机性能。主机再强,网络不行,画面照样糊、照样卡。我把网络环境分成三个档次来说明。
第一档:有线局域网。主机和客户端都用网线连到同一台路由器或交换机上。这是最理想的场景,延迟可以压到个位数毫秒,码率可以拉到 50Mbps 甚至更高,画质接近本地。如果条件允许,强烈建议至少主机端走有线,因为主机端要上传,无线上传的稳定性远不如有线。
第二档:无线局域网(Wi-Fi 5/6)。客户端用 Wi-Fi,主机用有线。这种情况下延迟通常在 10-30ms 之间,取决于信号强度和干扰。5GHz 频段是必须的,2.4GHz 基本没法用。Wi-Fi 6 环境下体验会好很多,但依然不如纯有线稳定。我实测下来,同样的设置,有线客户端几乎感觉不到延迟,Wi-Fi 客户端在快速转视角的游戏里能感觉到轻微的不跟手。
第三档:跨网络(公网)。主机和客户端不在同一个局域网,通过公网连接。这种情况下延迟取决于两边的上行带宽和中间链路质量,通常很难低于 30ms,而且波动大。画质和码率都要往下调。这种场景下,Sunshine 的码率建议控制在 10-20Mbps,分辨率降到 1080p,帧率 60 帧,编码格式优先选 HEVC 以节省带宽。
注意:跨网络串流涉及网络配置,具体怎么打通两个网络不在本文讨论范围内,这里只讲串流本身的参数调整。你只需要知道,网络延迟和带宽是决定体验的天花板,主机性能只是地板。
3.3 码率、分辨率、帧率的三角平衡
这三个参数是串流画质的核心,它们之间是互相制约的关系。码率决定了每秒传输的数据量,分辨率决定了画面的像素数量,帧率决定了画面的流畅度。在带宽固定的情况下,提高其中一个,另外两个就要妥协。
举个具体的例子。假设你的网络稳定上行是 30Mbps。如果你想要 4K 分辨率,那帧率可能只能到 30 帧,而且码率要拉到接近 30Mbps,画面一动就糊。如果你降到 1080p,那帧率可以上到 60 甚至 120,码率 20Mbps 就能有不错的画质。如果你进一步降到 720p,那码率 10Mbps 就够,延迟也能更低。
我的建议是:优先保证帧率和延迟,其次保证分辨率,最后才追求极致画质。因为串流的核心体验是“操作跟手”和“画面流畅”,静态画质的细微差异在动态场景里根本注意不到。具体来说,1080p 60帧 20Mbps 是一个甜点配置,适合大多数局域网场景。如果网络特别好,可以上到 1440p 60帧 30Mbps。4K 串流目前对网络和硬件的要求都还比较高,除非你有很好的有线和很强的显卡,否则不建议作为默认配置。
编码格式的选择也影响这个平衡。H.264 兼容性最好,但同码率下画质不如 HEVC。HEVC 在同画质下能省大约 30% 的码率,但解码端的要求稍高,老设备可能不支持。AV1 是最新的,效率更高,但目前支持 AV1 编码的显卡还不多,客户端解码支持也参差不齐。所以现阶段,HEVC 是性价比最高的选择,前提是你的显卡和客户端都支持。
3.4 输入延迟的排查与优化
输入延迟是串流体验里最敏感的部分。人对延迟的感知阈值大概在 20-30ms,超过这个数就能明显感觉到“不跟手”。输入延迟由好几段组成:客户端采集输入 → 网络传输 → 主机处理 → 画面编码 → 网络回传 → 客户端解码显示。每一段都贡献一点。
排查输入延迟,首先要区分是“网络延迟”还是“处理延迟”。一个简单的方法是看 Moonlight 自带的统计信息(通常按某个快捷键可以调出),它会显示网络延迟、解码延迟、渲染延迟等分项。如果网络延迟高,那是网络问题;如果解码延迟高,那是客户端性能问题;如果编码延迟高,那是主机显卡问题。
网络延迟的优化:主机走有线、客户端尽量走有线或 5GHz Wi-Fi、关闭路由器上的 QoS 和流量整形(有时候这些功能反而添乱)、确保没有其他设备在大量占用带宽。
解码延迟的优化:客户端如果是老设备,可能解码能力不足。比如用几年前的低端平板跑 1080p 60帧 HEVC,解码延迟可能就有 20ms。这时候要么换设备,要么降规格到 H.264 或者 720p。
编码延迟的优化:主机端在 Sunshine 配置里可以调整编码器的预设(preset)。预设越偏向“速度”,编码越快、延迟越低,但同码率下画质略差。预设越偏向“质量”,编码越慢、延迟越高,但画质更好。对于串流,建议选偏速度的预设,因为画质的损失在动态画面里不明显,但延迟的降低是实打实的。
4. 常见问题排查与独家避坑经验
4.1 画面黑屏、花屏、卡死的排查顺序
串流出问题,症状无非几种:黑屏、花屏、卡死、闪退。排查要讲顺序,从最简单的可能性开始,逐步深入。
黑屏最常见的原因是虚拟显示器没生效或者分辨率不匹配。先检查主机端显示设置里虚拟显示器是否在线,分辨率是否和 Sunshine 配置里的一致。如果虚拟显示器在线但串流还是黑屏,检查 Sunshine 的日志,看编码器是否初始化成功。有时候编码器初始化失败,Sunshine 会回退到软件编码,但软件编码在某些分辨率下会直接失败导致黑屏。
花屏通常是网络丢包或者码率超过带宽导致的。先降码率试试,如果降了就好,说明是带宽问题。如果降了还花,检查网络是否有丢包(用 ping 或者更专业的工具看)。另外,某些显卡驱动在特定编码格式下有 bug,比如 HEVC 在某个驱动版本上会花屏,换成 H.264 就正常。这种时候要么换编码格式,要么更新/回退驱动。
卡死可能是主机端 GPU 占用过高,编码器抢不到资源。比如主机同时在跑一个吃满 GPU 的游戏,Sunshine 的编码器就没法及时编码,导致卡顿甚至卡死。解决办法是限制游戏的帧率或者画质,给编码器留出余量。一般来说,编码器占用 GPU 的 5%-10% 是比较健康的,如果超过 20%,说明 GPU 太忙了。
闪退多半是客户端的问题。Moonlight Qt 在某些平台上偶发闪退,可以尝试换版本或者换平台。如果主机端 Sunshine 闪退,检查日志里有没有内存访问错误或者驱动崩溃的记录。
4.2 无头主机的分辨率锁定问题
无头主机最烦人的问题之一是分辨率被锁死。明明 ParsecVDisplay 支持 1440p,但系统就是只给 1080p 选项,或者刷新率上不去。这个问题的根源通常在于 EDID 信息。
EDID 是显示器告诉系统“我支持哪些模式”的一份数据。物理显示器有真实的 EDID,虚拟显示器也有,但虚拟显示器的 EDID 是驱动模拟出来的。如果模拟的 EDID 里没有你想要的模式,系统就不会提供那个选项。
解决办法是编辑 ParsecVDisplay 的 EDID 配置。不同版本的驱动配置方式不同,有的是改注册表,有的是改配置文件。核心思路是找到 EDID 数据块,按照标准格式添加你需要的分辨率和刷新率描述符。这个过程稍微有点门槛,但网上有现成的 EDID 编辑工具,可以图形化地生成 EDID 数据,然后替换掉驱动默认的。
我自己的做法是:先用工具生成一个包含我所有常用模式的 EDID(1080p60、1080p120、1440p60、1440p120),然后替换驱动配置,重启之后所有模式都能选了。这一步做完,后面切换分辨率就非常方便,不用每次改配置。
4.3 音频不同步与爆音的处理
音频问题比画面问题更隐蔽,因为画面卡了你一眼能看出来,音频有问题有时候要听一会儿才发现。常见的音频问题有三种:完全没声音、声音有爆音或断续、声音和画面不同步。
完全没声音,前面说过,多半是无头主机没有音频输出设备。装虚拟声卡解决。
爆音或断续,通常是音频缓冲区设置不当或者网络抖动导致的。Sunshine 的配置里有音频缓冲区的参数,适当加大缓冲区可以减少爆音,但会增加音频延迟。这是一个权衡,一般加到 50-100ms 的缓冲比较合适,既能压住爆音,延迟也还能接受。
声音和画面不同步,这个比较麻烦,因为音频和视频是两条独立的流水线。轻微的偏移(几十毫秒)人耳不太敏感,但超过 100ms 就能明显感觉到。解决方法是调整音频或视频的缓冲,让两条流水线的延迟尽量一致。实际操作中,可以先调视频缓冲,观察音画同步情况,找到一个平衡点。
4.4 常见问题速查表
为了让你在遇到问题时能快速定位,我把上面提到的和没提到的常见问题整理成一张表。
| 症状 | 可能原因 | 排查方法 | 解决方向 |
|---|---|---|---|
| 黑屏无画面 | 虚拟显示器未生效 | 检查显示设置 | 重装或配置 ParsecVDisplay |
| 黑屏无画面 | 编码器初始化失败 | 查看 Sunshine 日志 | 更换编码器或更新驱动 |
| 花屏 | 网络丢包 | ping 测试 | 改善网络或降码率 |
| 花屏 | 编码格式 bug | 换 H.264 测试 | 换格式或换驱动版本 |
| 卡顿 | GPU 占用过高 | 看 GPU 使用率 | 限制游戏帧率或画质 |
| 无声音 | 无音频输出设备 | 检查声音设置 | 安装虚拟声卡 |
| 爆音 | 音频缓冲过小 | 调整缓冲参数 | 加大缓冲区 |
| 输入延迟高 | 网络延迟高 | 看 Moonlight 统计 | 优化网络路径 |
| 输入延迟高 | 解码能力不足 | 看解码延迟 | 降规格或换客户端 |
| 分辨率锁死 | EDID 不含目标模式 | 检查可选模式 | 编辑 EDID 配置 |
| 配对失败 | 防火墙拦截 | 检查端口 | 放行 47989/47990/48010 |
| 搜不到主机 | 不同网段 | 检查 IP | 手动添加主机 IP |
这张表覆盖了八成以上的常见问题。遇到新问题的时候,先对照这张表排除,如果表里没有,再去查日志。日志是最可靠的线索来源,Sunshine 和 Moonlight 都有详细的日志输出,学会看日志能省下大量瞎折腾的时间。
4.5 几个容易被忽略的细节
最后分享几个我在长期使用中总结的细节,这些在官方文档里通常不会写,但实际很影响体验。
第一个细节:主机端的电源计划。Windows 默认的电源计划在空闲时会降频,这会导致串流启动的瞬间有卡顿。把电源计划设成“高性能”或者“卓越性能”,让 CPU 和 GPU 始终保持较高频率,串流的响应会明显更跟手。
第二个细节:关闭主机的屏幕保护程序和自动锁屏。无头主机如果触发了屏保或锁屏,串流画面会变成锁屏界面,而且有些情况下输入回传会失效。在电源设置里把屏保和睡眠都设成“从不”。
第三个细节:Moonlight 客户端的渲染设置。Moonlight Qt 里有渲染相关的选项,比如是否开启垂直同步、是否使用硬件加速渲染。垂直同步能消除画面撕裂,但会增加一点延迟。硬件加速渲染能降低渲染延迟,但老设备可能不支持。根据自己的设备和偏好调整。
第四个细节:定期更新 Sunshine 和 Moonlight。这两个项目都在活跃开发中,新版本经常修复 bug、提升性能、增加功能。但也不要盲目追新,有时候新版本会引入回归问题。我的做法是:当前版本稳定就不动,遇到问题或者看到明确的性能提升再升级。
第五个细节:主机端的杀毒软件和游戏反作弊。某些杀毒软件会扫描 Sunshine 的网络流量,导致延迟增加。某些游戏的反作弊系统会误判串流软件,导致游戏无法启动或者被封禁。在串流游戏之前,先确认游戏的反作弊政策是否允许串流。一般来说,单机游戏没问题,竞技类网游要谨慎。
这套 Sunshine + Moonlight + ParsecVDisplay 的组合,我从最初的折腾到现在的稳定使用,中间踩了不少坑,也积累了不少经验。它不是那种装完就能无脑用的方案,需要你理解每个组件的作用,根据自己的硬件和网络环境做针对性调整。但一旦调好,它的体验是很多商业方案都比不了的——开源、免费、可定制、画质和延迟都能做到很高水准。如果你愿意花点时间折腾,它绝对值得。