
PS5入手一年半游戏进度推进了不少但主机里积压的截图和录像也越来越多。每次想导到电脑上处理都要在主机界面里一张一张勾选一次最多几十张多选几次就让人失去耐心。更不用说远程串流参数、存储空间预警这些信息都散落在不同菜单里想统一看一眼就得翻半天。所以就有了AnyPS5这个项目——一个不破解主机、不刷固件的纯辅助工具集目标是把我平时在PS5身上做的重复劳动尽量用PC端脚本和界面自动化接管。下面这篇文章就是整个项目的完整记录从需求拆解到代码实现再到实际踩过的坑。如果你有一点Python基础平时也爱折腾自己的主机这篇应该能给你一些可以直接上手复用的思路。1. 项目定位与需求拆解1.1 为什么PS5玩家需要AnyPS5这样的工具先说最痛的场景媒体文件导出。PS5的截图和录像导到电脑上目前主流的路径就是开Remote Play进主机界面或者通过手机App一张张保存。这两种方式都绕不开“手动勾选”的步骤而且主机端的媒体库每次批量选中数量有限视频文件还要先播放一遍才能导出到手机。对于一个习惯每周整理素材的人来说这个过程极其消耗耐心。第二个痛点是信息分散。游戏库占用多少空间、哪个游戏最近没打开、固件是不是又有了新版本、Remote Play的码率参数到底怎么调才不卡——这些内容分别藏在系统的不同菜单里。想要一张“所有关键状态一眼看全”的仪表盘官方居然一直没有提供。这其实才是AnyPS5最核心的驱动力不是去破解任何限制而是把散落的官方信息集中起来把重复操作从人工菜单浏览变成脚本自动化。第三个痛点也是实际开发中才意识到的Remote Play的配置文件参数非常不友好。默认分辨率不一定是本机最优帧率优先和画质优先的取舍也常常让人抓狂。但它的配置文件是存在本地电脑里的只要肯花点功夫研究字段含义完全可以做成一个“一键生成配置”的小工具。这些需求叠加在一起就构成了AnyPS5的雏形——一个纯PC端的PS5辅助工具箱。1.2 为什么选择做“辅助型工具”而不是“越权工具”在项目立项的时候身边有人在劝我干脆去做破解固件或者模拟器方向那样流量更大。但我的态度很明确不做。原因有三。第一Let me think in terms of stability. 主机如果刷了非官方固件意味着每次系统更新都要冒着变砖风险游戏存档和网络服务也可能被平台判定异常。这和我的初衷完全相反——我是想省时间不是想给自己制造维护压力。第二官方对主机文件系统、存档目录的权限管得很严。就算通过某些方式读到了底层数据相当于把工具箱推入了灰色地带后续的维护成本根本不是个人开发者能兜住的。第三真正高频的痛点其实并不需要破解系统就能解决。媒体文件的批量导出、串流参数的调整、存储空间的状态汇总这些统统可以通过Remote Play加界面自动化来实现完全在官方认证的使用范围之内。所以我把项目定性为“辅助型工具”PC端跑脚本主机端只依赖官方功能不做任何数据篡改。技术选型上我最终选了Python而不是Node.js核心原因是图像识别和OCR生态更成熟。OpenCV、PyAutoGUI、Tesseract这些库几乎是开箱即用写Small Tool快速迭代的效率明显高于Node生态。对于这种需要频繁和屏幕像素打交道的项目Python显然更省心。2. 核心功能与实现原理2.1 先用一段代码让电脑发现PS5要让PC端工具连接到PS5第一步是找到主机的IP地址。我的做法和手机App类似利用局域网内的发现协议向组播地址发一条搜索指令PS5收到后就会返回自己的设备信息包括IP、设备名称、服务端口等。代码实现不复杂用Python的socket库就能完成。import socket import re msg ( M-SEARCH * HTTP/1.1\r\n HOST: 239.255.255.250:1900\r\n MAN: \ssdp:discover\\r\n MX: 3\r\n ST: urn:schemas-sony-com:service:host:device\r\n \r\n ).encode() sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(5) sock.sendto(msg, (239.255.255.250, 1900)) sock.bind((, 1900)) while True: try: data, addr sock.recvfrom(4096) text data.decode(errorsignore) if PS5 in text or sonydevice in text: ip re.search(rLOCATION:.*?//([\d\.]), text) if ip: print(发现设备, ip.group(1), addr[0]) except socket.timeout: break注意上面代码搜索的是通用设备发现服务具体厂商字段在不同固件版本里可能会有差异。我在实际调试时发现PS5的发现服务并不完全稳定有时候需要多发送几次搜索才会响应。所以建议把这段逻辑封装成循环比如每隔30秒自动扫描一次这样比手动触发可靠得多。2.2 用屏幕自动化代替不存在的导出接口PS5媒体文件要想批量导出到电脑厂商没有开放PC端的批量下载接口。所以AnyPS5的做法是先通过Remote Play把主机画面投到电脑上再用OpenCV识别主机媒体库界面里的按钮和勾选框把原来的人工点击变成脚本自动点击。这里有个关键认知我们不是在做外挂而是在模拟玩家自己的操作。每一步操作都是主机的官方界面只是把“点哪里”和“点几下”交给代码来完成。实现上我会维护一个模板图库每个模板对应媒体库界面的一个元素。import cv2 import numpy as np import pyautogui # 主机媒体库分辨率为1920x1080截屏 screen pyautogui.screenshot() screen cv2.cvtColor(np.array(screen), cv2.COLOR_RGB2BGR) template cv2.imread(select_all_button.png, cv2.IMREAD_COLOR) res cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) _, max_val, _, max_loc cv2.minMaxLoc(res) if max_val 0.9: h, w template.shape[:-1] pyautogui.click(max_loc[0] w // 2, max_loc[1] h // 2)实际跑下来模板匹配的准确率主要卡在两个点一个是Remote Play窗口缩放比例另一个是主机界面语言。不同语言环境下按钮文字不一样模板匹配就会失效。所以我把模板按照屏幕分辨率和语言做了分组运行时先根据Remote Play设置判断是哪种组合再加载对应的模板包。2.3 串流配置一键生成Remote Play在Windows上的配置文件路径在用户目录的AppData下面具体到每个版本略有差异。配置里可以设置画面分辨率、帧率、码率上限等参数。AnyPS5做了一个配置文件生成器根据用户的网络带宽和显示器分辨率推荐一组值。import yaml config { window_width: 1920, window_height: 1080, frame_rate: 60, bitrate: 20000, codec: h264 } with open(remoteplay_config.yml, w, encodingutf-8) as f: yaml.dump(config, f)不过这里要提醒一句Remote Play的配置文件不是纯YAML不同版本甚至会用不同的结构来保存。我的做法是先手动设置一次Remote Play然后用脚本扫描配置目录里所有文件找到变更过的残留文件再反推字段含义。这种方式避免了直接操作注册表可能带来的权限问题。2.4 存储空间与游戏时长的统计游戏占用空间和剩余容量主机自带界面有显示但没有导出接口。AnyPS5的方案是通过OpenCV截取存储设置页面的截图再用OCR识别里面的“可用容量”和“各游戏已用空间”。计算剩余比例也很简单剩余比例 可用容量 / 总容量 * 100这样至少能让玩家在PC上看到“还剩多少空间、哪个游戏最占地方”不用每次跑主机设置里翻。后来我还加了一个通知脚本当剩余空间低于20%时自动弹窗提醒。虽然这是很简单的逻辑但实际用起来非常安心。3. 实操过程与关键代码3.1 开发环境的准备和目录规划我的开发环境是Windows 10 Python 3.10主要依赖OpenCV、NumPy、PyAutoGUI、PyYAML、pytesseract。为什么要选这些OpenCV和NumPy用来做图像处理、模板匹配和OCR预处理PyAutoGUI负责屏幕自动化点击和截屏PyYAML用来读写串流配置文件结构清晰pytesseract负责对存储界面截图做文字识别。建议项目目录这样规划anyps5/ ├── main.py # 入口 ├── config/ │ └── settings.yaml # 主机IP、串流参数、模板路径 ├── templates/ # 按钮截图模板 │ ├── zh_Hans/ │ └── en_US/ ├── src/ │ ├── discover.py # 设备发现 │ ├── remoteplay.py # 串流配置生成与检测 │ ├── media_export.py # 媒体批量导出助手 │ └── storage.py # 存储空间OCR统计 └── output/ # 所有自动化生成的结果目录清晰之后每个模块可以独立调试。比如设备发现有问题不需要把整个项目跑起来直接在命令行里python src/discover.py就能测。3.2 设备发现模块的实现细节设备发现模块的核心是持续监听局域网响应。除了2.1的SSDP方式我还加了一个回退方案直接让用户手动输入PS5的IP地址。因为有些复杂网络环境下SSDP分组会被路由器过滤这时自动发现就失效了。我在discover.py里维护了一个设备列表每个设备记录IP、最后发现时间、响应次数并对同一IP在短时间内重复出现做去重。最终输出的结构长这样devices [ { ip: 192.168.1.100, name: PS5, last_seen: 1699999999, response_count: 3 } ]这个结构会传给后续所有模块远程串流参数、媒体导出、存储监控都依赖这个基础信息。所以我在开发时特意保留了“手动添加IP”的选项避免自动发现不稳定直接导致整个工具不可用。3.3 媒体导出助手的工作流程媒体导出是整个项目里最复杂的一个模块我把它设计成四个阶段连接、定位、勾选、下载。连接阶段先启动Remote Play等画面出现后用图像匹配判断主界面是否加载完成。定位阶段在屏幕中搜索媒体库图标匹配成功就点击进入。勾选阶段脚本会按照提前配置好的排序规则按时间倒序自动选中当天或者本周的所有截图和视频。下载阶段其实没有真的“下载”而是利用Remote Play的自带功能——只要进入媒体界面选择“保存到本机”文件就会通过Remote Play通道拉取到电脑。我为这个流程写了一篇伪代码梳理逻辑1. 扫描到设备IP 2. 启动Remote Play进程 3. 等待窗口出现并最大化 4. 在窗口内定位“媒体库”入口 5. 点击进入 6. 定位“每月/每周”筛选标签 7. 循环点击文件并选择保存到本机 8. 校验下载目录文件数是否等于目标数实际用下来这比手动操作快了三倍左右而且不会漏选文件。最关键的坑是点击之后一定要等待一小段时间否则主机会把后一次点击误判成双击。3.4 把脚本封装成定时任务为了让工具不依赖手动启动我用Windows计划任务做定时执行。创建一个.ps1脚本里面调用Python的虚拟环境然后执行对应模块。比如每周日早上9点自动运行一次存储监控和媒体导出提醒。$env:Path ;C:\Python310 Set-Location D:\anyps5 python -m venv .venv .venv\Scripts\Activate.ps1 python main.py --task storage --remind 20计划任务直观的配置点是“触发器”里选成每周时间设定为周末。这里我的建议是不要把任务设得太频繁一天多次扫描会频繁唤醒Remote Play对主机和路由器都有额外负担。我目前是“每周扫描一次存储每天晚上检查一次网络唤醒状态”。这样即不会遗漏重要变化也不会浪费资源。4. 常见问题与排查实录4.1 设备发现正常但连接总失败这个问题的表象是AnyPS5能找到PS5的IP但之后所有网络请求都超时。我排查后遇到最多的原因有两个。第一主机处于“待机模式”下虽然能响应SSDP发现但Remote Play服务并不会主动建立连接。解决办法是提前在主机的系统设置里打开“从网络唤醒”和“允许Remote Play连接”两个开关都必须开启。第二路由器开启了AP隔离导致同一Wi-Fi下的设备虽然能互相看到但数据传输被阻断。判断方法很简单在PC上ping一下PS5的IP如果通但TCP 9295端口不通多半就是隔离策略在作祟。解决方式是把两台设备放到同一个子网或者直接用有线连接。4.2 模板匹配在4K分辨率下失效我在开发初期用的是1080p窗口做模板匹配后来换了4K显示器后模板匹配率直线下降。原因很直接Remote Play窗口的实际渲染尺寸变了模板还是1080p时的像素坐标。处理方式有两种。一种是先截屏获取真实窗口尺寸然后把模板等比缩放到同尺寸再进行匹配。另一种是在模板包里维护多套分辨率的模板。实际操作中缩放是更省事的方法因为模板缩放对识别精度的影响不算大。我在代码里加了缩放逻辑scale_x current_width / reference_width scale_y current_height / reference_height调试下来缩放后匹配阈值可以保持在0.85到0.9之间。低于0.85基本就要怀疑是模板语言或者界面布局变了。4.3 Remote Play连接频繁掉线这个问题的根源偏网络环境。最常见的是带宽不稳定尤其是无线连接时PC和主机之间的延迟波动明显Remote Play就会主动断开重连。我的排查顺序是先换有线连接测试再检查路由器是否有流控或者限速设置最后看PC端的运行负荷。如果显示器只有60Hz把串流帧率从120强制改成60掉线概率会明显下降。码率也不必拉满20000Kbps左右在多数场景下画质和流畅度比较均衡。4.4 OCR字体识别不准存储空间界面用OCR识别时偶尔会把数字0识别成字母O或者把千分位逗号给漏掉。开始以为是Tesseract的模型问题后来发现是截图对比度不够。我加了图像预处理先转灰度再做自适应阈值化最后识别准确率从70%提到了95%左右。gray cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY) ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU)如果识别后的数字明显不对我会把原始截图保存下来放进一个“待人工复核”目录。这样即使脚本判断错了也不会直接把错误数据写进统计结果。5. 项目复盘与后续扩展5.1 几个让脚本更实用的小技巧第一个小技巧是给所有远程操作加上“动作间延时”。Remote Play本质上走的是网络传帧界面响应速度和本地操作有差距。如果点击过快主机会漏掉输入看起来就像按钮失灵。我现在每个动作之间固定加0.1到0.3秒的随机延时整体流程依然很快但稳定多了。第二个技巧是善用主机自带的“远程游玩”模式而不是自己去和主机的系统服务做复杂的协议交互。AnyPS5的绝大多数功能都建立在Remote Play之上这样即使固件版本频繁更新我的脚本也只需要适配界面变化不需要重新逆向协议维护成本低了很大一截。第三个技巧是模板目录定期备份。每次主机系统更新后界面细节可能微调模板图也要跟着换。我会把旧的模板包压缩存档这样一旦新模板有问题可以快速回滚。5.2 后续可以这样继续扩展AnyPS5目前还是单机PC工具下一步我准备加一个Web UI让手机也能随时看到主机的存储状态和串流参数而不是只能在电脑前操作。另外多人共用一台主机的场景也可以再做深一点比如给不同用户配置不同的模板和串流预设。接口层面也有一些可以完善的空间比如把设备发现、存储监控、媒体导出都抽成独立服务这样未来想加一个Telegram机器人或者微信提醒只需要调服务接口就行。整个项目本身不值得多高大上但它把主机使用中“琐碎的高频动作”变成了可以重复执行的最小模型这个思路对很多硬件周边项目都有参考价值。如果你也想做类似的事先从一个你每天都在做的痛点开始就好不需要等官方开放接口更不需要走灰色路线把现有的官方功能吃透已经足够省下大量时间了。