← 项目
工程重构持续重构

Moonlight+ 多平台游戏串流客户端

从 PC 串流工具,演进为面向多游戏平台的统一入口

基于 Moonlight Android、Sunshine 与 chiaki-ng 的多端重构:已完成统一游戏库、设备管理、PC 会话接管和 PS5 实机串流,并以本地视觉识别验证 PlayStation 游戏目录与按游戏启动;Xbox 与原装 Switch 继续沿平台适配边界推进。

处理流程

01启动直达游戏库

02统一平台目录

03平台协议适配

04低延迟串流

05会话接管

背景与目标

从单台 PC 串流,扩展到统一的多平台游戏入口。

原版产品围绕一台 PC 展开:先选择宿主机,再查看由这台主机提供的应用。Moonlight+ 的目标则是让用户从一个游戏库进入不同平台,所以平台必须成为稳定的领域属性,而 PC、PlayStation、Xbox 或 Switch 只是提供游戏与串流会话的不同 Provider。

改造先在不破坏 PC 串流能力的前提下完成信息架构、交互状态和会话模型,再把各平台的发现、认证、目录、启动、输入与断线恢复收口为可替换适配层。PlayStation 已从前期协议调研进入真实 PS5 联调;视觉目录虽然已经形成可运行原型,但仍明确保留识别概率、系统界面变化和自动化超时等能力边界。

已完成PC 体验与接管、PS5 注册/唤醒/串流、触控板实机修复
实验能力PS5 本地视觉游戏目录、缓存展示、按游戏启动与直接恢复
下一阶段提高视觉识别稳定性,采购并验证 Xbox 与 Switch 硬件链路

设计与架构

信息架构设计

页面调整同时落实到领域属性和会话状态模型。

01

游戏优先,而非设备优先

已配对设备存在时,启动直接进入最近主机的游戏库。设备选择器只是全局切换入口,不再成为每次启动都必须经过的上一级页面。

02

平台分类与排序解耦

平台是默认领域分组;名称、添加时间是组内排序。先按平台聚合,再分别排序,避免把不同生态的游戏混成一条全局序列。

03

会话必须有完整生命周期

每个快捷串流入口都同时表达开始、继续、退出;跨设备接管则由服务端能力声明、客户端确认和原子化切换共同完成。

ANDROID EXPERIENCE统一游戏库 / 设备选择 / 会话控制
PLATFORM CONTRACT发现 · 认证 · 目录 · 启动 · 输入 · 恢复
PC
GameStream
PlayStation
Remote Play
Xbox
xHome / WebRTC
Switch
Capture bridge

协议调研

平台方案与集成判断

参考代码已按版本保存在本地,后续使用真实硬件逐项验证。

平台首选项目 / 路线当前状态为什么这样选
PCMoonlight + Sunshine主链路已验证

沿用成熟的 GameStream 兼容协议与硬件编解码链路,并在客户端和宿主端同时扩展会话能力。

PlayStationchiaki-ngPS5 主链路已实机验证

作为 Android Library 与 JNI 原生库进入同一 APK,已验证注册、唤醒、局域网音视频和输入;视觉游戏目录仍按实验能力管理。

XboxXStreaming等待硬件联调

MIT 许可,覆盖微软认证、xHome 与 WebRTC;greenlight 作为桌面端行为和兼容性的第二参考。

SwitchHDMI/UVC + ESP32-S3硬件方案已设计

原装系统没有 Remote Play 协议;Bridge 负责采集、识别和编码,ESP32-S3 在底座 USB 口模拟手柄,SysDVR 仅保留为 CFW 参考。

Switch 的实现约束

原装 Switch 采用“采集 Bridge + ESP32-S3 手柄桥”,而不是等待不存在的 Remote Play 接口。

底座 HDMI 交给 1080p60 UVC/UAC 采集卡,x86 Bridge 负责视觉识别、硬件编码和 Sunshine 会话;ESP32-S3 插在底座 USB 口模拟 Pro Controller,并通过串口或局域网与 Bridge 交换按键、手机体感和震动。自动唤醒优先评估二手官方 Pro Controller 的 HOME 触点混合方案,游戏扫描则沿用“缓存优先、差异提示、用户确认刷新”的产品策略。

PlayStation 实机阶段

不把 Chiaki 当成第二个应用,而是收敛为同一套产品体验。

协议核心保持独立,设备、游戏和会话在 Moonlight+ 入口统一呈现。

01 / EMBED

单 APK 原生集成

chiaki-ng 的 Kotlin UI、Room 数据层、C/C++ Remote Play 核心与 JNI 以 Android Library 进入主工程,四种 ABI 均可构建,不再跳转到独立安装的客户端。

02 / ONBOARDING

账号与注册闭环

受限 WebView 承载 Sony 登录页,回调后只换取 numeric user_id 并转换为 Chiaki 所需的 8 字节 Account ID;注册过程以进度文本替代底层日志。

03 / CONTROLS

移动端输入适配

可隐藏整套虚拟按键,同时保留可拖动、贴边、三秒后半隐藏的悬浮 PS 键;Touchpad Only 模式也不会丢失系统菜单入口。

04 / VISION

本地视觉游戏库

解码帧只在设备本地进入 OCR 与版面分析,扫描时不确认启动游戏;名称、封面指纹和位置写入按主机隔离的缓存,返回游戏库后稳定展示。

05 / SESSION

继续而非重复启动

已运行目标游戏时直接恢复画面;释放旧 Remote Play 会话后遇到暂时性的主机占用,会按有限次数重试,而不是把用户重新带回注册或首页遍历。

06 / DIAGNOSTICS

以实机日志修正状态机

在联想 Y700 上复现“长按后持续按下”的触控板故障,逐层追踪 Android MotionEvent、反馈队列与终止包,最终分离 terminal event 并保证 release 到达。

实验边界

视觉目录没有 Sony 官方游戏列表接口可依赖,当前仍可能受主题、语言、首页状态和 OCR 命名影响而漏扫或误命名;因此扫描、自动启动和失败回退持续以可取消实验能力呈现。

24 秒实机演示

从发现 PlayStation 游戏,到直接打开目标游戏。

传统 PS Remote Play 客户端通常以“选择主机—进入当前画面”为入口。Moonlight+ 在主机注册后进一步扫描并缓存游戏,让 PlayStation 条目与 PC 游戏一起出现在统一游戏库;用户点击封面后,应用在不展示菜单跳转的准备层中定位并启动目标游戏。

  1. 01游戏库直接展示已发现的 PS5 游戏
  2. 02点击封面后自动连接已注册主机
  3. 03进度层呈现定位与启动状态
  4. 04确认目标游戏启动后再交还画面
实机录屏:在统一游戏库选择 PlayStation 游戏,Moonlight+ 完成连接、定位并启动目标游戏。

开发日志

改造过程

01

研究与边界

下载并固定 Moonlight、Sunshine、chiaki-ng、XStreaming、greenlight、SysDVR、ns-remote 与 pyremoteplay 源码;把协议参考仓库与应用工程隔离,避免许可证和构建系统意外混入。

02

启动与品牌

替换应用图标,增加品牌载入动画;读取最近使用的主机,在启动阶段直接打开游戏库,消除先出现“添加机器页”再跳转的闪屏。

03

导航重构

设备管理从默认首页变成独立页面。游戏库左上角入口负责打开设备选择器,但两页保持平级;系统返回仍按 Android 预期退出应用。

04

统一游戏库

删除厂商排序,以平台作为默认且不可关闭的一级分组;空平台不渲染,名称或添加时间排序在各平台内部独立执行。

05

串流状态闭环

Desktop 与 Steam 快捷入口加入运行态判断;再次点击时提供继续或退出选项,并复用已有的确认、停止与轮询逻辑。

06

设备接管

在 Sunshine 暴露能力与活动会话数;新设备确认接管后仅终止旧 RTSP 会话、保留当前应用,再通过 takeover 参数恢复串流。

07

PlayStation 原生集成

把 chiaki-ng Android 客户端、C/C++ 核心和 JNI 作为库模块打进 Moonlight+,保留 Room 凭据边界,并完成 PS5 发现、账号、注册、唤醒、解码和输入的实机闭环。

08

统一 PS 设备体验

把添加 PS 主机收口到统一设备页,注册过程隐藏底层日志并改为进度状态;主机详情、设置、缓存展示和游戏库刷新遵循与 PC 相同的交互语言。

09

视觉游戏目录

在 Remote Play 解码帧上使用本地 OCR、版面特征和封面指纹扫描 PS5 首页;目录与封面按主机缓存,自动启动期间用可取消进度层隐藏菜单操作。

10

恢复与输入兼容

目标游戏已经运行时直接恢复画面,并对释放旧会话后的暂时占用进行有限重试;同时通过实机日志修复 Y700 上触控板长按后 release 丢失和滑动失效。

界面对比

信息架构与游戏库

同一台横屏 Android 设备上的原版 Moonlight 12.0.1 与当前 Moonlight+ 实机截图。

01 / STARTUP & HOSTS

设备列表从必经首页,变成按需打开的全局选择器

新版记忆最近主机并直达游戏库;左上角设备按钮负责添加、删除和切换主机,同时不改变 Android 系统返回的含义。

原版 Moonlight 主机选择页面
原版 Moonlight 12.0.1:启动后先进入主机选择,设备是必经层级
当前 Moonlight+ 统一设备管理页面
当前 Moonlight+:PC 与 PlayStation 统一管理,设备页按需打开
02 / GAME LIBRARY

从单一应用网格,变成可承载四个平台的统一目录

平台分类默认生效且空分组自动隐藏;排序在每个平台内部单独执行。Desktop 与 Steam 作为有运行状态的快捷入口固定在顶部工具区。

原版 Moonlight 单台 PC 应用网格
原版 Moonlight 12.0.1:当前 PC 的应用全部平铺在同一网格
当前 Moonlight+ 按平台分区的统一游戏库
当前 Moonlight+:PC 与 PlayStation 分区展示,统一进入和刷新

构建与验证

从“能编译”推进到 PC 与 PS5 的真实链路验证

统一 APK 已覆盖 arm64-v8a、armeabi-v7a、x86 与 x86_64,并在 Android 设备和真实 PS5 上验证注册、唤醒、串流与输入;Sunshine 端为 takeover 参数增加了服务端能力和单元测试。

PS5局域网注册、唤醒、音视频与输入主链路通过
4 ABI统一 APK 原生库构建与安装成功
Y700触控板长按残留问题完成实机回归
PASS会话接管单元测试通过
能力边界

当前证据覆盖 PC、Sunshine 接管和 PS5 局域网主链路。PlayStation 视觉识别仍需提高完整率与命名稳定性;远程 IPv6、Xbox 与 Switch 硬件桥尚未进入完成状态。

后续计划

文档与实机验证待办

验证 01

PS 视觉稳定性

补充不同首页位置、主题、语言和运行状态样本,提高漏扫、命名与直接恢复的确定性。

验证 02

PS 状态识别

继续区分可开始、可继续、未下载完成、需要用户选择及其他不可直接游玩的状态。

验证 03

Switch 采集原型

采购 1080p60 UVC/UAC 采集卡和 x86 Bridge,先测量采集、编码与端到端延迟。

验证 04

Switch 控制原型

使用 ESP32-S3 验证 USB HID、手机体感和震动回传,再进入视觉游戏目录阶段。