资讯动态

Sunshine + Moonlight 串流实战:X86/X64/安卓客户端部署与避坑指南

发布时间:2026/10/14 18:10:13 来源:尧图企业网站定制
简介这是一套面向串流游戏与超低延迟应用场景的完整工具组合包含Sunshine服务端与Moonlight客户端覆盖X86、X64及Android多平台适合希望在PC、手机、平板间实现跨设备高画质游戏串流的玩家与开发者。资源包共2868个文件约64.79MB以2023个svg图标资源、415个js脚本、107个scss与34个css样式文件为主另含ts、flow、map等前端工程文件以及bat批处理脚本、exe可执行程序、hlsl着色器、json配置与多语言字体文件结构完整便于部署与二次开发。内容预览中可见服务安装、防火墙规则配置、虚拟手柄驱动等批处理脚本以及前端样式与界面资源说明该包同时涵盖服务端部署与客户端界面所需素材。目前已有16453人学习下载可帮助读者快速搭建低延迟串流环境体验AMD、NVIDIA及Intel核显下的流畅游戏串流并借助Android客户端实现移动端无缝接入。1. 串流方案选型为什么 sunshine 服务端加 moonlight 客户端值得折腾家里有台性能还行的台式机显卡是 N 卡或者 A 卡平时跑游戏、做渲染、剪视频但人经常在客厅、书房甚至床上不想被机箱拴住。这种场景下sunshine 服务端加 moonlight 客户端的组合是这几年被反复验证过的一条低延迟串流路线。它把主机当成一台“游戏服务器”把画面和声音编码后推到局域网或公网另一端的设备上客户端只负责解码和回传手柄键鼠输入。整套方案开源、免费、跨平台服务端能跑在 Windows 和 Linux 上客户端覆盖 X86、X64 桌面系统以及安卓设备正好对应标题里那三种目标平台。它解决的问题很直接不用把主机搬来搬去也不用买昂贵的采集卡和延长线。只要网络条件过得去就能在另一台电脑、电视盒子或者安卓平板上继续用主机的算力。适合谁适合手里已经有主机、又有多终端使用需求的人适合想自己掌控串流链路、不愿意被商业云游戏平台绑死的人也适合想研究低延迟视频编码和输入回传的开发者。但要注意这套方案对网络质量敏感对显卡编码器有要求配置项也不少第一次上手容易在防火墙、编码器和分辨率匹配上翻车。2. 把 sunshine 服务端跑起来从安装到第一帧画面2.1 服务端安装与显卡编码器选择sunshine 服务端的安装包在 Windows 上是一个可执行文件Linux 上则根据发行版有对应的包或者编译方式。安装完成后它会以系统服务或者托盘程序的形式常驻首次启动会引导你设置用户名和密码这个凭据是给 moonlight 客户端配对用的不是系统账号。安装过程中最关键的决策是编码器选择N 卡用 NVENCA 卡用 AMFIntel 核显用 QSVLinux 上还可能用到 VAAPI。选错编码器会导致要么无法启动串流要么延迟高得没法玩。我一般会先确认显卡驱动版本足够新然后在 sunshine 的配置界面里把编码器手动指定而不是依赖自动检测。自动检测在双显卡笔记本上经常认错把串流任务丢给核显结果帧率上不去。配置项里还有“编码预设”和“码率”两个参数预设越偏向质量编码延迟越高码率则直接决定画面清晰度和带宽占用。局域网内 1080p60 一般给 20 到 30 Mbps2K 或者 4K 要往上加但别超过网络实际承载能力。# Linux 下查看可用编码器设备确认 VAAPI 或 NVENC 是否就绪 ls /dev/dri/renderD* # 输出示例/dev/dri/renderD128 # 如果只有 renderD128通常对应核显或独显的渲染节点 # 再查 vainfo 确认支持的编码格式 vainfo | grep -i h264上面这段命令用来在 Linux 上确认硬件编码节点是否存在。/dev/dri/renderD*是 DRM 渲染设备节点sunshine 需要访问它才能调用硬件编码。vainfo会列出驱动支持的编码 profile如果看不到 H.264 或 HEVC 相关条目说明驱动或固件没装好这时候硬编码肯定跑不起来得先解决驱动问题。2.2 配对与基础串流参数设置服务端跑起来后moonlight 客户端会通过 mDNS 或者手动输入 IP 来发现它。首次配对需要在客户端输入服务端设置的用户名和密码配对成功后服务端会记住这个客户端。这一步常见的坑是防火墙Windows 防火墙默认会拦掉 sunshine 的入站端口需要手动放行或者把 sunshine 加入允许列表。Linux 上则是 ufw 或者 firewalld 的规则问题。配对完成后客户端会列出可用的应用。sunshine 默认会抓取系统里已安装的游戏和桌面也可以手动添加自定义应用。对于安卓客户端建议把“串流桌面”也加上方便在没有游戏时直接操作主机。分辨率、帧率、码率这三个参数在客户端侧也能调但最终生效的是两边协商的结果。我习惯先在服务端把分辨率上限设成显示器的原生分辨率帧率设成 60码率给足然后在客户端根据实际网络情况往下调。# Windows 下用 PowerShell 放行 sunshine 默认端口 New-NetFirewallRule -DisplayName Sunshine Stream -Direction Inbound -Protocol TCP -LocalPort 47984,47989,48010 -Action Allow New-NetFirewallRule -DisplayName Sunshine Stream UDP -Direction Inbound -Protocol UDP -LocalPort 47998,47999,48000,48002,48010 -Action Allow这段 PowerShell 命令放行了 sunshine 常用的 TCP 和 UDP 端口。TCP 端口用于配对和控制信令UDP 端口用于视频、音频和输入数据的传输。如果只放行 TCP 不放行 UDP会出现能配对但串流黑屏或者卡顿的情况。端口号在不同版本里可能略有差异以服务端日志里实际监听的为准。2.3 验证服务端是否正常工作服务端启动后日志是最直接的排查入口。Windows 上日志在安装目录的logs文件夹Linux 上通常在~/.config/sunshine/或者 systemd 的 journal 里。正常启动会看到编码器初始化成功、监听端口、mDNS 广播等条目。如果编码器初始化失败日志里会明确写出来比如找不到 NVENC 或者 VAAPI 初始化错误。验证串流是否真的走通了最土但最有效的办法是用 moonlight 客户端连上去打开一个对延迟不敏感的应用比如记事本或者文件管理器观察画面是否流畅、鼠标是否跟手。如果画面能出来但鼠标延迟明显多半是网络或者编码参数问题如果画面根本出不来先看服务端日志有没有报错再看客户端有没有收到视频流。这一步别急着调游戏先把基础链路跑通。3. moonlight 客户端在 X86 与 X64 桌面上的部署差异3.1 X86 与 X64 客户端的安装包选择moonlight 客户端在桌面平台上有多个版本Windows 上主要是 X64 安装包X86 版本现在比较少见但在一些老旧的 32 位系统或者特殊嵌入式环境里还会用到。Linux 上则有 Flatpak、Snap、AppImage 以及发行版仓库里的包。选择哪个版本第一看系统架构第二看依赖库是否齐全。X64 系统装 X86 客户端通常能跑但性能和解码器支持可能打折扣反过来 X86 系统装不了 X64 客户端这是硬限制。安装完成后客户端第一次启动会搜索局域网内的 sunshine 服务端。如果搜不到可以手动添加 IP 地址。手动添加时要注意端口默认是 47989如果服务端改过端口这里也要跟着改。配对过程需要输入服务端设置的用户名和密码配对成功后客户端会保存一个证书或者令牌后续连接不用重复输入。# Linux 下用 Flatpak 安装 moonlight 客户端 flatpak install flathub com.moonlight_stream.Moonlight # 启动客户端 flatpak run com.moonlight_stream.MoonlightFlatpak 安装的好处是依赖隔离不会污染系统库适合不想折腾依赖的用户。缺点是首次启动可能需要在权限设置里放行网络和输入设备访问。如果串流时手柄没反应先检查 Flatpak 的权限配置确保它有权访问/dev/input下的设备节点。3.2 桌面端解码器与渲染后端配置moonlight 客户端在桌面端支持多种解码方式硬件解码走显卡的 NVDEC、VAAPI 或者 DXVA软件解码走 CPU。硬件解码延迟低、CPU 占用小但兼容性依赖驱动软件解码兼容性好但高码率下 CPU 容易吃满导致画面卡顿。我一般优先选硬件解码如果遇到花屏或者绿屏再切回软件解码对比确认是解码器问题还是网络问题。渲染后端在 Windows 上通常是 Direct3DLinux 上是 OpenGL 或者 Vulkan。渲染后端选错会导致画面撕裂或者垂直同步失效。如果显示器支持高刷新率客户端这边也要把帧率上限设成匹配的值否则会出现画面节奏不对的情况。还有一个容易忽略的点是音频输出设备串流时音频默认走客户端本机声卡如果客户端没有声卡或者声卡被占用会出现无声或者爆音。# 查看 moonlight 客户端支持的解码器选项Linux 下通过命令行参数 moonlight --help | grep -i decoder # 常见输出--video-decoder auto|hw|sw # auto 是自动选择hw 强制硬件sw 强制软件这个命令用来确认客户端支持哪些解码器参数。不同版本的 moonlight 命令行参数可能略有不同但--video-decoder这个选项在多数桌面版本里都存在。如果自动选择有问题可以强制指定硬件或软件解码快速定位问题来源。3.3 桌面端输入设备与手柄映射桌面端串流时键盘鼠标的输入回传相对简单手柄则要看客户端系统能不能识别。Windows 上 Xbox 手柄即插即用moonlight 会自动映射Linux 上需要确保手柄被内核识别为 evdev 设备并且当前用户有权限读取。如果手柄在客户端本机能用但串流到主机后没反应多半是 moonlight 没有把输入事件转发过去检查客户端的输入设置里有没有启用手柄。键鼠映射在桌面端一般不需要额外配置但有些游戏会检测到输入来自串流而拒绝响应这时候可以试试在客户端开启“鼠标抓取”或者“相对鼠标”模式。相对鼠标模式会把鼠标移动转换成相对位移适合第一人称射击游戏绝对鼠标模式则适合桌面操作和策略游戏。这个选项在客户端设置里能切换根据玩的游戏类型选。4. 安卓客户端触屏、手柄与网络适配的实战细节4.1 安卓端安装与基础串流设置安卓端的 moonlight 客户端可以从应用商店或者官方发布的 APK 安装。安装后首次启动会请求网络和存储权限如果拒绝网络权限客户端根本搜不到服务端。安卓设备的碎片化严重不同厂商对后台进程和网络的管理策略不一样串流时如果切到后台再切回来可能会断流需要在系统设置里把 moonlight 加入电池优化白名单。基础串流设置和桌面端类似分辨率、帧率、码率。安卓设备屏幕尺寸和比例差异大建议把分辨率设成设备原生分辨率帧率设成 60码率根据 Wi-Fi 质量给。如果设备支持硬件解码优先用硬件解码否则 1080p60 的软解会让中低端手机发热降频。安卓上还有一个“显示模式”选项可以选拉伸或者保持宽高比根据游戏画面比例选。# 通过 adb 查看安卓设备支持的硬件解码器 adb shell dumpsys media.player | grep -i decoder # 或者用更直接的方式查看 OMX 组件 adb shell cat /proc/omx_components这两条命令用来在安卓设备上确认硬件解码器支持情况。dumpsys media.player会输出媒体框架的解码器信息/proc/omx_components则列出 OMX 组件。如果设备不支持 H.264 硬解串流 1080p 会很吃力这时候要么降低分辨率要么换设备。安卓版本和芯片平台不同输出内容差异很大以实际能看到的为准。4.2 触屏虚拟按键与手柄连接安卓端最大的特点是触屏操作。moonlight 客户端内置了虚拟按键覆盖层可以自定义按钮位置、大小和透明度。对于没有实体手柄的用户虚拟按键是唯一的选择但触屏的延迟和手感肯定不如实体手柄。我一般会把虚拟按键的透明度调低避免遮挡画面同时把常用按键放在手指自然落点的位置。如果用手柄安卓设备可以通过蓝牙或者 USB OTG 连接。蓝牙手柄延迟比有线高但胜在方便有线手柄延迟低但线材可能影响握持。连接后需要在 moonlight 客户端里确认手柄被识别并且按键映射正确。有些手柄的安卓模式默认映射成键盘事件需要在客户端里手动改成手柄模式否则串流到主机后按键全乱。# 查看安卓设备已连接的输入设备 adb shell getevent -l # 按动手柄按键观察是否有对应事件输出 # 如果没有任何输出说明手柄没被系统识别getevent -l会实时打印输入事件按动手柄时如果能看到EV_KEY或者EV_ABS事件说明系统层面已经识别。如果看不到先排查蓝牙配对或者 OTG 连接再排查手柄模式。这个命令在调试手柄映射时非常有用能快速区分是系统没认到还是 moonlight 没转发。4.3 安卓端网络优化与延迟控制安卓设备的 Wi-Fi 性能参差不齐串流延迟很大一部分来自无线网络。5GHz 频段比 2.4GHz 延迟低、带宽大但穿墙能力弱所以设备和路由器之间尽量少隔墙。如果条件允许用 Wi-Fi 6 路由器并且把设备连到 5GHz 频段能明显改善串流体验。移动网络下串流基本不可用延迟和抖动都太大除非是应急场景。安卓系统本身的后台限制也会影响串流稳定性。有些厂商的系统会在检测到前台应用长时间占用网络时主动限速或者在有通知时抢占网络资源。我一般会在串流前开启飞行模式再单独打开 Wi-Fi关掉不必要的后台应用减少干扰。如果还是卡顿可以在 moonlight 客户端里把码率调低牺牲画质换流畅度。5. 避坑与排查串流链路上最容易翻车的五个点5.1 黑屏但有声音编码器与解码器不匹配现象是客户端能连上声音正常但画面全黑或者绿屏。原因通常是服务端编码器和客户端解码器协商失败比如服务端用 HEVC 编码客户端硬件不支持 HEVC 硬解软解又没启用。解决方法是先在服务端把编码格式改成 H.264兼容性最好然后在客户端确认解码器设置是自动或者硬件如果硬件不支持就切软件。如果改完还是黑屏看服务端日志里编码器有没有报错有时候是驱动版本太旧导致编码器初始化失败。5.2 画面卡顿但网络带宽充足帧率与刷新率不匹配现象是网络测速没问题但画面一顿一顿的像掉帧。原因可能是客户端显示器的刷新率和串流帧率不匹配比如串流 60 帧但显示器是 59.94Hz或者客户端渲染后端开了垂直同步导致帧节奏错乱。解决方法是在客户端把帧率设成和显示器刷新率一致或者关闭垂直同步。另外检查服务端主机显示器的刷新率如果主机是 30Hz 而串流设 60编码器会重复帧看起来也会卡。5.3 手柄按键错乱输入映射模式选错现象是手柄连上了但按键功能全不对比如按 A 出 B或者摇杆方向反了。原因是手柄在安卓或者 Linux 上被识别成了键盘或者鼠标设备moonlight 按默认映射转发自然对不上。解决方法是在客户端输入设置里手动选择手柄模式或者用getevent确认手柄上报的事件类型再在 moonlight 里做自定义映射。Windows 上一般不会有这个问题因为 XInput 手柄的映射是标准的。5.4 配对成功但连不上防火墙或端口被占现象是客户端能发现服务端输入密码后配对成功但点连接就失败。原因通常是 UDP 端口被防火墙拦了或者服务端端口被其他程序占用。解决方法是检查服务端日志里实际监听的端口然后在防火墙里放行对应的 TCP 和 UDP 端口。如果端口被占改服务端端口客户端手动添加时用新端口。Windows 上还要注意有没有第三方安全软件在拦截。5.5 安卓端串流几分钟后断流后台限制与发热降频现象是安卓设备串流几分钟后突然断开或者画面变得极卡。原因是系统把 moonlight 放到后台限制网络或者设备发热导致 CPU/GPU 降频解码跟不上。解决方法是在系统设置里把 moonlight 加入电池优化白名单关闭省电模式同时检查设备温度如果烫手就降低串流分辨率或者码率减少解码压力。有些设备还需要在开发者选项里关闭“暂停执行已缓存的应用”。6. 进阶技巧用脚本批量管理串流配置与快速切换串流用久了会发现不同场景需要不同的配置在客厅电视上玩 4K 游戏要 high 码率在安卓平板上玩独立游戏要低延迟在书房显示器上办公要清晰文字。每次手动改参数很烦我一般会用脚本把常用配置存成几套切换时一键应用。sunshine 服务端的配置文件和 moonlight 客户端的配置都可以通过命令行或者配置文件修改不需要每次都点图形界面。以 Linux 服务端为例sunshine 的配置在~/.config/sunshine/sunshine.conf里面可以预设多组编码参数。我习惯写一个 bash 脚本根据传入的参数生成对应的配置片段然后重启服务。客户端这边moonlight 支持通过命令行参数覆盖分辨率、帧率和码率所以可以在桌面快捷方式里带上不同参数实现“一键开电视模式”或者“一键开平板模式”。#!/bin/bash # sunshine 配置切换脚本示例 # 用法./switch_profile.sh livingroom 或 ./switch_profile.sh tablet PROFILE$1 CONF$HOME/.config/sunshine/sunshine.conf case $PROFILE in livingroom) # 客厅电视4K60高码率HEVC sed -i s/^resolution.*/resolution 3840x2160/ $CONF sed -i s/^fps.*/fps 60/ $CONF sed -i s/^bitrate.*/bitrate 50000/ $CONF sed -i s/^encoder.*/encoder nvenc/ $CONF ;; tablet) # 安卓平板1080p60中等码率H.264 兼容性好 sed -i s/^resolution.*/resolution 1920x1080/ $CONF sed -i s/^fps.*/fps 60/ $CONF sed -i s/^bitrate.*/bitrate 20000/ $CONF sed -i s/^encoder.*/encoder nvenc/ $CONF ;; *) echo 未知配置$PROFILE exit 1 ;; esac # 重启 sunshine 服务使配置生效 systemctl --user restart sunshine echo 已切换到 $PROFILE 配置这个脚本用sed直接修改配置文件里的关键字段然后重启服务。resolution、fps、bitrate、encoder是四个最常调的参数。客厅模式给高分辨率高码率平板模式降分辨率保兼容。脚本里用systemctl --user restart sunshine是因为我把 sunshine 跑在用户级 systemd 下如果是系统级服务去掉--user即可。改完配置一定要重启服务否则不生效。客户端这边Windows 上可以给 moonlight 的快捷方式加参数Linux 上可以写个 wrapper 脚本。比如#!/bin/bash # moonlight 客户端快速启动脚本 # 用法./moonlight_launch.sh livingroom PROFILE$1 case $PROFILE in livingroom) moonlight stream -app Desktop -width 3840 -height 2160 -fps 60 -bitrate 50000 ;; tablet) moonlight stream -app Desktop -width 1920 -height 1080 -fps 60 -bitrate 20000 ;; *) echo 未知配置$PROFILE exit 1 ;; esac这个脚本调用 moonlight 的命令行模式直接指定分辨率和码率。-app Desktop表示串流桌面也可以换成具体的游戏名称。命令行参数会覆盖客户端界面里的设置适合做快捷方式。注意不同版本的 moonlight 命令行参数名可能略有差异用moonlight stream --help确认一下。验证配置是否生效最直接的方法是串流后看服务端日志里的编码参数或者在客户端按快捷键调出性能覆盖层看实际的分辨率、帧率和码率。如果发现参数没变检查配置文件路径对不对以及服务有没有真正重启。我踩过的一个坑是配置文件里字段名写错比如把bitrate写成bit_rate服务端不报错但也不生效白白折腾半天。所以改完配置一定要看日志确认。这套脚本化管理的思路核心是把“场景”和“参数”解耦用脚本做映射。后面如果加了新设备只需要在 case 里加一个分支不用重新学一遍配置项。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑