“买 PS5 回来吃灰,是很多玩家最不想面对的结果。不是不想玩,而是主机被固定在客厅电视前,家里人要看剧、你住在公司宿舍、或者临时出差,手柄摸不到、画面也带不走,于是一台几千块的设备就那么晾着。我折腾了个叫AnyPS5的自托管串流网关项目,把这件事彻底解决了:只要有一台能跑 Docker 的小主机,配合 AnyPS5,你就可以用任意设备的浏览器远程串流 PS5,键鼠、手机触屏、手柄都能接,不用安装官方客户端,也不依赖一台固定电脑。
这篇文章我会把项目的完整思路、技术选型、配置步骤和常见坑一次性写透。如果你是刚接触串流的新手,可以按着步骤跑通第一台 PS5;如果你已经在玩远程游戏,重点看看中间的架构拆解和对照排查表,应该能少走不少弯路。
1. 为什么做 AnyPS5:官方串流方案绕不过去的几道坎
1.1 官方 Remote Play 体验里的“三根刺”
先说明一点,官方 Remote Play 不是不能用,它胜在开箱即用。像我这种常年在 Linux 环境下工作的人,刚接触它时反而最难受。官方客户端对平台的支持非常有限,Windows 和手机端体验还算完整,但在 Linux 上基本没有官方选择,Mac 的支持也时有时无。如果你在宿舍里只有一台小主机,或者单位电脑不方便安装客户端,那基本上就告别了远程串流。
第二根刺是登录和网络限制。官方串流必须绑定 PSN 账号,每隔一段时间还要重新验证,一旦验证不过,就会进入“停止这条路走不通”的状态。局域网还好,局域网之外想连回家里,很多时候需要做端口映射或者借助网络设备,官方客户端却不会告诉你到底去了哪些端口,出了问题只能靠瞎猜。
第三根刺是输入限制。官方串流对触控和键鼠的支持非常抽象,虚拟手柄的按键布局稀烂,而且不同设备上的行为完全不一致。手机触控只有“模拟手柄”一种模式,映射到按键上有延迟,影响手感。
1.2 AnyPS5 的定位
我做 AnyPS5 时的定位很明确:不做一个“官方串流的复制品”,而是做一个“反向的串流网关”。它负责接入 PS5,然后通过自己的 WebRTC 会话把画面和音频分发给任意浏览器。客户端只需要有浏览器即可,不需要安装任何 App,也不需要理解 PS5 的注册流程。
更重要的是,它把“输入”做了一个统一的接入层。无论你用的是手柄、键盘、鼠标,还是手机触控,都可以在网页端映射成 PS5 的按键事件。将来想加一个新的输入设备,只需要在网页前端加一套映射规则,不需要改后端协议。
它也不是视频推流平台,不录制游戏画面,不改动主机系统,更不涉及任何游戏文件操作。AnyPS5 只是在你的 PS5 和你手上的设备之间,充当了一个可控的、低延迟的桥梁。
1.3 适合谁来用
- 想用 Linux 电脑、手机浏览器、老平板玩 PS5 的人。
- 觉得官方串流每次都要验证很烦,想自己控制权限和会话的人。
- 想给家人或朋友开一个“网页串流入口”,但又不想教他们装客户端的人。
- 对直播和编码工具链熟悉,想在此基础上二次开发的人。
如果你只打算在电视前用手柄玩,不折腾这些,那完全不需要看 AnyPS5。它是给那些“希望主机突破客厅限制”的人准备的自己动手方案。
2. 方案选型:为什么 AnyPS5 要做成“网关”而不是另一个客户端
2.1 围绕一条核心链路设计
AnyPS5 的核心链路有两根,一根叫视频链路,一根叫输入链路。视频链路从 PS5 出来,经过 AnyPS5 的解码、重编码,通过 WebRTC 送到浏览器;输入链路从头手端收集手柄或触控事件,通过 WebSocket 送到 AnyPS5 后端,再转成 PS5 远程协议能识别的按键指令。
有人问,为什么不直接让每个设备都装上 PS5 远程协议的客户端?原因很简单:客户端的工作模式基本上是一对一的。你要在手机上看一眼,就得在手机上再装一个客户端;想在平板上临时玩两把,又得给平板装一个。AnyPS5 不一样,它把所有设备的流量都集合到一个网关上,同一个会话可以被多个浏览器接入,设备间随时切换,体验是连续的。正如一个只支持单人通话的即时通讯软件,和一个支持多人视频会议的软件,它们面对的场景完全不同。
2.2 WebRTC 相比 RTMP、HLS 的优势
串流协议的选择上,我一开始考虑过 HLS,理由是浏览器兼容性最好。但实际一测就发现问题:HLS 切片延迟太高,哪怕切成 1 秒一个分片,端到端延迟也在 2 秒以上。PS5 手柄操作的反馈要求延迟控制在 100ms 以内,不然按下跳跃键,角色要 “飞” 出去才看到跳动,完全没有可玩性。
RTMP 的情况也差不多,它需要额外的浏览器插件,在大部分现代浏览器里根本没有原生支持,等于直接劝退用户。WebRTC 则天然适合这种场景:基于 UDP,走 RTP 音视频传输,结合 ICE/STUN 为局域网和公网环境做通道协商,延迟可以轻松压到 50ms 左右。
2.3 为什么输入通道单独走 WebSocket
很多人尝试在 WebRTC 数据通道里直接传输入事件,这确实可行,但它也给视频同道添了不少麻烦。当网络出现波动时,数据通道和视频通道共享同一套协商参数,如果数据通道包迟迟收不到,视频画面会被连累。
AnyPS5 把输入事件单独抽出来,走 WebSocket,一方面它与视频通道不互相干扰,另一方面也能在服务端做更细的命令合并。比如当触控和键盘同时发送相同按键时,服务端会做一个去重和合并,避免 PS5 收到重复的按下事件。这个设计在本地测试时看不出多大区别,但只要你试过一次跨公网高丢包环境,就能体会到稳定性的差距。
3. 部署 AnyPS5 之前的准备清单
3.1 硬件配置要求
AnyPS5 本身是一个很轻的后端服务,但它要做视频的转封装和重编码,所以建议有一台带硬件编解码能力的小主机。我自己用的是一台带 Intel 核显的迷你主机,4 核 8 线程,内存 8GB,跑起来剩余资源还很充足。
PS5 主机自然不能少。它不一定一直开着,AnyPS5 支持 Wake-on-LAN 唤醒,只要 PS5 处于待机状态并且允许网络唤醒,就可以在后端调用魔术包把它叫醒。网络环境上,最好是有线连接,PS5 接路由器,AnyPS5 小主机也接网线。如果主机的 Wi-Fi 够强,并且两台设备离路由器都比较近,用 5GHz Wi-Fi 也能跑,但延迟和稳定性会稍微差一点。
3.2 软件环境准备
AnyPS5 用 Docker 部署最方便。只要机器上装有 Docker 和 docker-compose 插件,就能一条命令把服务拉起来。如果你不想用容器,也可以直接跑后端二进制,但我不推荐,因为 WebRTC 依赖的端口和防火墙规则比较多,容器模式能帮你管理一部分环境变量和端口映射。
浏览器这边,优先使用 Chrome、Edge 或者新版 Firefox。Safari 对 Gamepad API 和 WebRTC 的 H.264 支持相对不够完整,手机端 iPhone 用户如果坚持用 Safari,可能会遇到手柄不识别的问题,换 Chrome 会好一些。
3.3 需要提前准备的账号信息
第一次连接 PS5 时,AnyPS5 需要完成一次设备注册,说白了还是借用官方 Remote Play 协议里的认证流程。你需要准备一个能正常登录的 PSN 账号,并且在 AnyPS5 的 Web 控制台里输入主机 IP、账号 ID 等信息。这个账号 ID 不是你的登录密码,而是账号在系统里的一串唯一标识,只需要在控制台页面里按提示填入即可。整个注册过程只发生一次,注册完成后后续启动就不需要再输入了。
4. 从零把 AnyPS5 跑起来:完整实操记录
4.1 获取代码和初始化配置
我假设你把 AnyPS5 的代码拿到了本地小主机上。进入项目目录后,第一步是复制环境变量模板。
git clone https://github.com/your-account/anyps5.git cd anyps5 cp .env.example .env接下来打开.env,你会看到这么几个关键项:
PS5_HOST=192.168.1.100 PSN_ACCOUNT_ID= WEB_AUTH_TOKEN= STREAM_WIDTH=1920 STREAM_HEIGHT=1080 STREAM_FPS=60 STREAM_BITRATE_MBPS=20 WEB_PORT=8080 ENABLE_WOL=true4.2 每个环境变量到底在控制什么
- PS5_HOST:PS5 在局域网里的 IP 地址。建议在路由器后台给 PS5 绑定一个固定 DHCP 地址,不然 Wake-on-LAN 唤醒后 IP 变了会连不上。
- PSN_ACCOUNT_ID:第一次绑定用的账号标识。
- WEB_AUTH_TOKEN:访问 Web 控制台的验证 token,相当于密码,千万不要用默认值。
- STREAM_*:控制串流分辨率、帧率、码率等。默认的 1080p60、20Mbps 能在大多数家庭网络里稳定运行。
- WEB_PORT:Web 控制台的监听端口。默认为 8080。
- ENABLE_WOL:开启后,后端会在开机时自动发送魔术包唤醒 PS5。
这几个参数里,最容易被忽略的是STREAM_BITRATE_MBPS。码率设置太低,画面上会出现明显的马赛克和拖影,特别是在动作游戏的高速场景;设置太高,又会让局域网带宽吃紧,尤其是 Wi-Fi 网络容易出现波动。建议先从 20Mbps 开始,如果你的局域网条件很好,可以逐步调高到 30 或 40Mbps,但不要超过网卡和 Wi-Fi 的实际可用带宽。
4.3 启动容器
配置改完后,执行:
docker compose up -d第一次启动会自动拉取基础镜像。如果镜像比较大,网络不好时可以稍微等等。启动完毕后查看日志:
docker compose logs -f当看到webrtc server started和ps5 registered之类的日志,说明启动成功。如果日志提示 PS5 连接失败,先检查 PS5_HOST 是否正确,以及 PS5 是否允许远程连接。
4.4 在浏览器里打开控制台
完成以上步骤后,在任意一台和 AnyPS5 在同一局域网里的设备上,打开浏览器访问http://小主机IP:8080。页面会要求输入WEB_AUTH_TOKEN,输入完成后进入控制台首页。
控制台主界面有三个标签页:主机状态、会话管理、设置。主机状态页会显示当前 PS5 的开机/待机状态,点击唤醒按钮可以发送 Wake-on-LAN 包;会话管理页负责创建串流会话,并生成一个带 token 的分享链接;设置页可以进行高级配置,比如输入映射和编码参数。
第一次连接时,点击“添加 PS5”,填写 IP 和账号 ID,后台会自动完成绑定。整个过程可能需要十几秒,绑定成功后你会看到主机的固件版本和当前后电量状态。一切就绪后,点击“开始串流”,浏览器就会自动弹出 WebRTC 播放窗口。
4.5 手柄、键鼠和触控的接通方式
在串流窗口里,AnyPS5 会自动检测当前浏览器的 Gamepad API 支持情况。如果你通过 USB 或蓝牙把手柄连接到了电脑,浏览器会在几秒内识别出来,并显示出“DualSense 已连接”。常见的 PS4 兼容手柄也能识别,但部分按键映射可能不完全对齐。
如果不想接手柄,也可以使用键盘映射。默认的键盘布局是 WASD 控制方向,空格跳跃,E 交互,鼠标控制视角。这个映射规则可以在设置页面完全自定义。手机和平板访问时,网页会自动加载虚拟手柄界面,左半区是摇杆区,右半区是按键区,按下区域会生成对应的触控事件。你还可以把虚拟手柄界面旋转到横屏模式,手感比官方移动 App 好不少。
5. 实测:局域网和远程两种场景下能做到什么程度
5.1 局域网测试结果
我自己在局域网环境里做了一组测试。PS5 用网线接入千兆路由器,AnyPS5 运行在同一台路由器的迷你主机上,手机通过 5GHz Wi-Fi 连接。
在 1080p60、20Mbps 设置下,网页端显示的端到端延迟稳定在 30ms 到 45ms 之间,体感和直连电视的差距很小。玩《对马岛之魂》这种对操作要求中等偏高的游戏,能明显感觉到有轻微延迟,但不影响正常游玩。如果切换到 30FPS 模式,延迟可以进一步降到 20ms 左右,但画面流畅度下降比较明显。
局域网测试中真正影响体验的是 Wi-Fi 信号质量。手机离路由器太远时,延迟会突然跳到 100ms 以上,画面还会出现卡顿。这个问题没办法通过码率完全掩盖,最有效的解决办法是降低串流帧率到 60FPS 以下,或者改用网线连接。
5.2 远程访问的热身准备
如果你人在外面,想通过公网继续串流,就需要在路由器上做端口映射。AnyPS5 默认需要开放 8080 端口用作 Web 控制台和 WebSocket,还需要开放一组 UDP 端口供 WebRTC 传输使用。
远程访问的延迟会随网络链路质量变化。在没有丢包的千兆光纤环境下,手机连接到家里的公网 IP,延迟大概在 60ms 到 90ms 之间。这个延迟已经接近很多云游戏的体验了,但前提是你家的上行带宽够。PS5 串流需要至少 20Mbps 的上行,如果你的宽带上行只有 10Mbps,就需要把码率降到 8Mbps 以下,画质会有明显损失。
提示:AnyPS5 默认只监听局域网,远程访问需要在配置里显式设置
PUBLIC_IP和PUBLIC_PORT,否则 WebRTC 的 ICE 协商会失败。
5.3 一个真实踩过的小坑
我远程串流时,经常遇到浏览器里能进控制台,但点击开始串流后一直卡在“正在连接”状态。后来查日志才发现,问题出在 WebRTC 使用的 UDP 端口没有在路由器映射出来。Web 控制台的 8080 端口是通了,但音视频数据走的 UDP 端口被防火墙挡住了。把所有涉及 UDP 的端口都映射出来之后,远程串流才顺利跑通。
6. 常见问题与排障实录
串流项目最怕的就是连不上、卡顿、闪断。下面这张表是我在调试 AnyPS5 过程中遇到的最典型的几个问题,以及对应的解法。
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 控制台能打开,但点开始串流一直转圈 | WebRTC 的 UDP 端口未映射或防火墙拦截 | 检查防火墙,确认STREAM_UDP_PORT_RANGE对应的端口已放行 |
| 串流画面花屏或绿屏 | 编码参数与浏览器解码不兼容 | 在设置里将STREAM_CODEC改为 h264,并降低分辨率到 720p 测试 |
| 手柄连接了但游戏没反应 | 浏览器未启用 Gamepad API,或者映射项为空 | 切换 Chrome/Edge 浏览器,并在输入映射里手动添加手柄按钮 |
| 画面延迟突然变高 | Wi-Fi 干扰或网络拥塞 | 检查路由器 QoS,关闭其他高占用设备,尽量使用有线连接 |
| PS5 无法被 Wake-on-LAN 唤醒 | 主机待机设置不允许网络唤醒 | 回到 PS5 系统设置,确认“允许通过网络开启主机电源”已开启 |
| 远程串流画面模糊 | 上行带宽不足 | 降低串流码率,优先保证帧率稳定而不是画质 |
6.1 为什么“能开控制台”不等于“能串流”
这是一个特别耐人寻味的误区。很多用户第一次远程访问时,发现控制台页面打开非常流畅,就以为端口映射正常。实际上控制台走的是 HTTP 协议,TCP 8080 端口只承载页面和少量信令,根本不涉及 UDP。WebRTC 音视频通道要求设备之间能互相发送 UDP 包,这需要一组额外的端口。如果路由器只映射了 TCP 端口,就会出现这种“界面能开、视频进不来”的诡异状态。
所以排查时,一定要按照协议分层来。第一层先确认 TCP 8080 端口通,第二层再确认 UDP 端口范围通,第三层才排查编码器和浏览器兼容性。
6.2 从日志里定位问题
AnyPS5 内置了分级日志,按事件类型打印在 Docker 日志里。启动服务后可以用下面的命令实时查看:
docker compose logs -f --tail=50看到ICE new candidate说明 WebRTC 正在尝试候选路径,如果一直不出现ICE connected,说明网络打洞失败。看到H264 decode error一般是码流参数不匹配,需要调整编码设置。看到频繁的ICE disconnected则说明网络链路不稳定,优先排查丢包而不是带宽瓶颈。
6.3 键盘映射不生效的检查项
键盘映射不生效的排查要分左右两端。在浏览器端,先确认焦点是否在串流窗口内,如果在其他标签页停留一段时间,Chrome 可能会暂停 Gamepad API 的持续通知。在后端,登录容器检查 WebSocket 是否收到了来自页面的输入事件:
docker exec -it anyps5-sidecar log /tmp/input-events.log如果后端没收到任何事件,问题大概率出在网页前端的事件监听;如果收到了事件但 PS5 没有响应,可能是按键映射表没有正确下发到远程协议层。把映射表清空后重新载入默认配置,通常能解决大部分自定义映射失败的问题。
7. 使用 AnyPS5 途中我学到的最重要的一件事
这里想分享一个实际体会。串流延迟这个东西,不能只看“网络延迟”一个数字。真正决定手感的,是网络延迟、编码延迟、解码延迟、输入事件处理延迟和画面渲染延迟的总和。AnyPS5 能做的,只是把这个总链路尽量做短,但每一层都可能有自己的坑。
我试过一味拉高码率,结果画面是清晰了,但手机解码器来不及处理,整体延迟反而更高。后来我把码率降到合理区间,帧率固定 60FPS,同时启用浏览器端的“低延迟模式”,反而获得了更稳定的体验。所以如果你在使用 AnyPS5 时觉得卡,不要一上来就怀疑后端有问题,可以先从浏览器端、网络链路、编码设置三个方向分别对照排查。
最后送你一个实用小技巧:在 Web 控制台里的分享链接,默认有效期只有 24 小时。如果你只是想让家里人临时用一下,可以开启“单次会话模式”,别人打开链接后,只需要输入一次授权 token 就能直接进入串流,不需要注册任何账号,也不需要看到后台的主机管理界面。这个功能拿来“远程帮家人调一下设置”特别好用,体验就像点开一个视频聊天链接,只不过另一端是 PS5 的画面。