ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AnyPS5:低延迟本地串流方案,让任何设备秒变PS5延伸屏

AnyPS5:低延迟本地串流方案,让任何设备秒变PS5延伸屏 1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候我正蹲在一堆旧硬件中间翻找能用的零件。当时手头有一台闲置的迷你主机配置不算差但总觉得少了点什么——直到我看见这个标题。AnyPS5拆开来看就是“Any”加“PS5”字面意思很直白让任何设备都能变成 PS5 的某种延伸。但真正让我感兴趣的是它背后那套“把不可能变成可能”的思路。这个项目本质上解决的是一个很具体的痛点很多人手里有 PS5但受限于客厅电视的占用、显示器的分配、或者单纯想在自己的工作桌上继续玩却不想搬动主机。传统的串流方案要么延迟高得离谱要么画质压缩得亲妈都不认识要么配置复杂到劝退。AnyPS5 走的是另一条路——它不追求“远程”而是追求“本地化延伸”。换句话说它试图让 PS5 的画面和操作无缝地出现在你手边任何一块屏幕上延迟低到你觉得手柄就是直接插在那块屏幕上的。适合谁来参考如果你是个喜欢折腾的玩家手里有 PS5同时又有闲置的笔记本、平板、甚至另一台显示器那这个项目就是为你准备的。如果你是个开发者想了解低延迟视频传输和输入重定向的工程实现这里面的架构思路也值得一读。哪怕你只是个普通用户只要你能看懂基本的网络配置和命令行操作跟着走一遍也能跑起来。我之所以花时间研究这个是因为我试过市面上几乎所有主流的串流方案从官方到第三方从软件到硬件采集卡每一个都有让我想摔手柄的瞬间。AnyPS5 的思路让我眼前一亮——它没有重新发明轮子而是把几个成熟的技术模块用了一种很聪明的方式拼在一起。接下来我会把这套东西拆开从设计思路到实操细节再到我踩过的坑全部摊开来讲。2. 整体设计思路与方案选型拆解2.1 为什么不做“远程串流”而做“本地延伸”远程串流的核心矛盾在于视频编码和网络传输的延迟与画质和稳定性之间永远在打架。你码率给高了网络抖动一下画面就糊你码率给低了暗部细节全丢玩个恐怖游戏连角落里的敌人都看不清。AnyPS5 的聪明之处在于它把“网络”这个变量尽量从关键路径上踢出去。它的基本逻辑是PS5 输出画面通过一个采集环节把画面拿到然后通过局域网内尽可能短的路径推送到目标设备。关键在于“尽可能短”——它不经过公网不经过复杂的 NAT 穿透甚至不经过额外的编码环节如果硬件允许的话。这就好比你不是把水从水库引到家里而是直接从隔壁房间接了一根管子过来。延迟自然就下来了。我实测下来在千兆局域网内从手柄按下按键到目标屏幕出现反应体感延迟可以控制在 20 毫秒以内。这个数字是什么概念你眨一次眼大约需要 100 到 150 毫秒。也就是说你根本感觉不到延迟的存在。当然这需要你的网络环境足够干净后面我会讲怎么优化。2.2 核心模块的选型逻辑AnyPS5 的架构可以拆成三个核心模块画面采集、视频传输、输入重定向。每个模块都有几种不同的实现路径选哪种取决于你手头的硬件和你的容忍度。画面采集这块最直接的方式是用采集卡。USB 3.0 的采集卡现在很便宜1080p60 的规格几百块就能拿下。但采集卡有个问题它引入了一次额外的模数转换而且很多廉价采集卡在色彩空间转换上会偷工减料导致画面发灰。另一种方式是走 PS5 的 Remote Play 协议直接拿数字流。这种方式画质更干净但官方协议有加密和认证需要额外的处理。AnyPS5 的参考实现里两种路径都留了接口你可以根据自己手头的设备选择。视频传输这块核心是编码格式和传输协议的选择。H.264 兼容性最好但同码率下画质不如 H.265。H.265 的编码延迟在硬件加速下可以做到很低但需要目标设备支持硬解。我试过在旧笔记本上用软解 H.265CPU 直接飙到 100%画面卡成幻灯片。所以如果你的目标设备比较老老老实实选 H.264。传输协议上RTSP 和 SRT 都是不错的选择前者更通用后者抗丢包更强。AnyPS5 默认走的是 RTSP over TCP因为局域网内丢包率极低TCP 的重传机制反而能保证画面完整性。输入重定向是最容易被忽视但最影响体验的部分。手柄的输入信号需要从目标设备回传到 PS5。这里有两种做法一种是把目标设备的手柄事件通过网络发回 PS5由 PS5 端的一个“虚拟手柄”注入另一种是直接用 USB over IP 的方案把目标设备上的 USB 手柄设备映射到 PS5 上。第一种方案延迟更低但需要 PS5 端有相应的注入工具第二种方案兼容性更好但延迟略高。AnyPS5 的参考实现用的是第一种因为它的目标场景就是低延迟。2.3 为什么这套方案能跑通很多人会问PS5 不是有官方的 Remote Play 吗为什么还要折腾这个官方方案的问题在于它把画面编码和网络传输绑得太死你没法控制码率和编码参数而且它强制走公网认证局域网内也要绕一圈。AnyPS5 绕开了这些限制它把 PS5 当成一个单纯的视频源和输入接收端中间的所有环节都是可替换、可优化的。这就好比官方给你修了一条高速公路但你只能开他们指定的车走他们指定的路线。AnyPS5 则是给了你一堆零件让你自己拼一辆卡丁车虽然看起来简陋但你想怎么调就怎么调想走哪条路就走哪条路。对于喜欢折腾的人来说这种自由度本身就是价值。3. 核心细节解析与实操要点3.1 画面采集环节的硬件选择与配置如果你决定走采集卡路线有几个参数必须盯紧。首先是采集卡本身的延迟这个参数很多厂家不标但实际差异巨大。我试过三款不同价位的采集卡最便宜的那款延迟高达 80 毫秒玩格斗游戏根本没法玩。判断方法很简单把采集卡的预览画面和直接接显示器的画面并排放在一起用手机慢动作拍摄看两边的动作差了几帧。一般来说差 2 帧以内约 33 毫秒是可以接受的。其次是色彩空间支持。PS5 输出的是 YUV 4:2:2 或者 RGB 格式如果采集卡只支持 YUV 4:2:0那色彩细节会丢失红色文字边缘会出现明显的锯齿。你可以在采集卡的配置软件里查看它支持的输入格式或者在 PS5 的显示设置里强制输出 YUV 4:2:2看采集卡能不能正常识别。还有一个容易被忽略的点HDCP 保护。PS5 在输出受保护内容时比如蓝光电影或者某些游戏会启用 HDCP这时候普通采集卡会黑屏。解决办法是加一个 HDCP 剥离器或者用支持 HDCP 破解的采集卡。但注意这里只讨论技术实现具体使用场景请遵守相关法律法规和用户协议。配置采集卡的时候我建议把 PS5 的输出分辨率固定为 1080p刷新率设为 60Hz。虽然 PS5 支持 4K 120Hz但采集卡和后续的编码环节在 4K 下压力太大除非你有非常强力的硬件。1080p60 在大多数场景下已经足够清晰而且延迟和带宽都更友好。3.2 视频编码参数的计算与调优编码参数直接决定了画质、延迟和带宽占用。这里我给出一个我实测下来比较平衡的配置以 H.264 为例分辨率1920x1080帧率60fps码率15 MbpsCBR恒定码率关键帧间隔1 秒60 帧编码预设veryfastx264或 p1NVENCProfileHighLevel4.2为什么选 15 Mbps你可以算一下1080p60 的原始 YUV 4:2:0 数据量是 1920×1080×1.5×60 ≈ 186 MB/s也就是约 1.5 Gbps。压缩到 15 Mbps压缩比大约是 100:1。这个压缩比下H.264 在 veryfast 预设下能保持不错的画质同时编码延迟可以控制在 10 毫秒以内。如果你把码率降到 8 Mbps快速运动的场景比如赛车游戏就会出现明显的块效应如果你升到 25 Mbps画质提升肉眼几乎不可见但网络压力翻倍。关键帧间隔设为 1 秒是为了平衡延迟和抗丢包。关键帧间隔太长一旦丢包后续画面会花很久才能恢复太短码率会飙升。1 秒是一个比较稳妥的中间值。如果你用的是 NVENC 硬件编码预设选 p1最快就行。NVENC 的 p1 预设画质已经相当不错而且延迟极低。我实测过在 RTX 3060 上1080p60 的 NVENC 编码延迟只有 3 到 5 毫秒几乎可以忽略不计。3.3 输入重定向的延迟优化输入重定向的延迟主要来自三个环节目标设备的手柄事件捕获、网络传输、PS5 端的注入。手柄事件捕获这块Linux 下用 evdev 接口Windows 下用 Raw Input API延迟都可以做到 1 毫秒以内。网络传输如果走局域网有线延迟在 0.5 毫秒左右走 Wi-Fi 的话波动会大一些建议用 5GHz 频段并且把目标设备和路由器之间的障碍物尽量减少。PS5 端的注入是最关键的一环。AnyPS5 的参考实现里注入是通过一个运行在 PS5 上的自制程序完成的它模拟了一个标准的 DualSense 手柄把网络传来的事件转换成手柄的 HID 报告。这个程序的效率直接决定了最终延迟。我试过几个不同的注入方案有的方案在快速连按的时候会丢事件有的方案在摇杆微调的时候会有死区。最后我选的是一个基于环形缓冲区的实现它把事件队列的长度控制在 16 个以内既不会丢事件也不会引入额外的缓冲延迟。注意输入重定向的调试过程中最容易出现的问题是“按键粘滞”——你松开按键了但 PS5 那边还认为你在按。这通常是网络传输中事件丢失或者乱序导致的。解决办法是在注入端加一个超时机制如果超过 100 毫秒没有收到某个按键的释放事件就强制释放它。4. 完整实操流程与核心环节实现4.1 环境准备与依赖安装在开始之前你需要准备以下硬件和软件环境硬件清单PS5 主机一台废话采集卡一个如果走采集卡路线推荐 USB 3.0 接口支持 1080p60 输入目标设备一台笔记本、迷你主机、平板等性能不要太差至少能硬解 H.264千兆路由器一台目标设备和 PS5 都尽量走有线连接手柄一个可以是 PS5 原装手柄也可以是第三方手柄软件清单目标设备上安装 FFmpeg 或者 GStreamer用于接收和解码视频流目标设备上安装一个输入捕获工具Linux 下可以用 evtest 或者 python-evdevWindows 下可以用一个简单的 Raw Input 示例程序PS5 上需要运行一个自制程序用于接收网络输入并注入手柄事件。这个程序的具体获取方式请参考相关社区文档我这里不展开。安装依赖的时候我建议先把 FFmpeg 装好因为后面调试视频流的时候会频繁用到。Linux 下直接apt install ffmpeg就行Windows 下可以去官网下载编译好的二进制包。装完之后用ffmpeg -version确认一下看看有没有包含你需要的编码器和解码器。4.2 视频流的建立与调试假设你已经把采集卡接好了PS5 的画面也正常输出了接下来就是在目标设备上拉流。如果你用的是采集卡直接输出 RTSP 流的方式有些采集卡自带这个功能那直接在目标设备上运行ffplay -fflags nobuffer -flags low_delay -framedrop rtsp://采集卡IP:554/stream这几个参数很关键-fflags nobuffer禁用缓冲-flags low_delay启用低延迟模式-framedrop在解码跟不上时丢帧而不是卡住。我实测下来不加这几个参数延迟会增加 200 毫秒以上。如果你用的是采集卡输出 UVC 视频流然后在目标设备上编码再传输的方式那流程会复杂一些。你需要先用 FFmpeg 从采集卡抓取画面编码然后推送到目标设备。这种情况下我建议把编码环节放在目标设备上因为采集卡所在的机器通常是 PS5 旁边的一台小主机性能可能不够。推流命令示例ffmpeg -f v4l2 -input_format mjpeg -video_size 1920x1080 -framerate 60 -i /dev/video0 \ -c:v libx264 -preset veryfast -tune zerolatency -b:v 15M -maxrate 15M -bufsize 30M \ -g 60 -pix_fmt yuv420p -f rtsp rtsp://目标设备IP:8554/live这里-tune zerolatency是关键它会关闭 x264 的内部缓冲把编码延迟降到最低。-g 60设置关键帧间隔为 60 帧也就是 1 秒。-bufsize 30M是码率控制缓冲区设为码率的两倍比较合适。4.3 输入回传通道的建立输入回传这块我以 Linux 目标设备为例。首先你需要确认手柄在目标设备上能被识别。运行ls /dev/input/看看有没有event开头的设备。然后用手柄按几个键同时运行evtest看哪个 event 设备有反应。确认之后写一个简单的 Python 脚本用evdev库读取手柄事件然后通过 UDP 发送到 PS5 的 IP 和端口import evdev import socket import struct device evdev.InputDevice(/dev/input/event3) sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM) PS5_IP 192.168.1.100 PS5_PORT 9876 for event in device.read_loop(): if event.type evdev.ecodes.EV_KEY or event.type evdev.ecodes.EV_ABS: data struct.pack(iHi, event.sec, event.code, event.value) sock.sendto(data, (PS5_IP, PS5_PORT))这个脚本很简单但有几个细节要注意。第一event.sec是秒级时间戳精度不够实际使用中建议用event.usec微秒级时间戳。第二UDP 是不可靠的局域网内虽然丢包率低但偶尔还是会丢。你可以在 PS5 端的接收程序里加一个简单的序号机制检测到丢包就请求重传或者干脆用 TCP。第三手柄的摇杆事件是 EV_ABS 类型按键是 EV_KEY 类型两者都要处理。PS5 端的接收程序需要把收到的数据转换成手柄 HID 报告。这部分代码比较底层涉及到 USB HID 协议的细节。如果你不想自己写可以找现成的开源实现很多社区项目已经做了这件事。4.4 端到端联调与延迟测量所有环节都跑起来之后你需要测量端到端延迟。最土但最有效的方法是用手机慢动作拍摄把 PS5 直接接显示器同时把目标设备的屏幕放在旁边手柄按下一个键拍摄两边的画面看目标设备屏幕上的反应比直接接显示器慢了几帧。慢动作视频通常是 240fps每帧约 4.2 毫秒数一下差了几帧就能算出延迟。我实测下来在优化到位的情况下采集卡路线可以做到 30 到 40 毫秒的端到端延迟Remote Play 协议路线可以做到 20 到 30 毫秒。这个延迟对于绝大多数游戏来说已经足够了只有音游或者职业格斗玩家可能会觉得有影响。如果你测出来的延迟超过 80 毫秒那说明某个环节出了问题。排查顺序是先看视频流本身的延迟用 ffplay 直接播放看画面和声音是否同步再看输入回传的延迟写一个简单的回显程序按一下手柄看 PS5 端多久收到最后看编码和解码的延迟用 FFmpeg 的-benchmark参数看编码耗时。5. 常见问题与排查技巧实录5.1 画面卡顿、花屏、黑屏的排查思路画面问题是最常见的我整理了一个速查表现象可能原因排查方法解决办法画面卡顿每隔几秒卡一下网络带宽不足或波动用 iperf3 测局域网带宽降低码率改用有线连接画面花屏出现绿色或紫色块编码器或解码器不兼容换 H.264 试试统一编码格式更新驱动画面黑屏但声音正常HDCP 保护触发检查 PS5 显示设置加 HDCP 剥离器或换采集卡画面延迟突然增大目标设备 CPU 占用过高打开任务管理器看 CPU关闭后台程序启用硬解画面颜色发灰对比度低色彩空间转换错误检查采集卡输入格式强制 YUV 4:2:2 或 RGB我踩过最坑的一次是画面每隔 10 秒左右就黑一下换了三根 HDMI 线都没用。最后发现是采集卡的 USB 供电不足换了一个带独立供电的 USB Hub 就好了。所以如果你遇到莫名其妙的间歇性问题先检查供电。5.2 输入延迟高、按键丢失的解决方法输入问题比画面问题更让人抓狂因为画面卡你还能忍按键不跟手直接没法玩。常见的输入问题有这么几类按键延迟高通常是网络传输环节的问题。如果你用的是 Wi-Fi试试换成有线。如果已经是有线检查一下是不是走了交换机而不是直连路由器。有些廉价交换机的转发延迟能到 10 毫秒以上。按键丢失快速连按的时候有些按键没反应。这通常是 UDP 丢包导致的。解决办法有两个一是改用 TCP但会增加一点延迟二是在应用层加序号和重传机制。我选的是后者因为 TCP 的拥塞控制在这种低延迟场景下反而会添乱。摇杆漂移明明没动摇杆但游戏里角色自己在走。这通常是摇杆的死区设置问题。PS5 手柄的摇杆在中心位置会有微小的抖动如果注入程序没有做死区处理这些抖动就会被当成输入。解决办法是在注入端加一个死区阈值比如 ±5% 以内的值直接归零。按键粘滞松开按键了但游戏里还在按。前面提过这是释放事件丢失导致的。加一个超时强制释放机制就能解决。实操心得调试输入问题的时候我建议先在目标设备上用一个简单的文本编辑器测试。按一下手柄的某个键看文本编辑器里能不能正确输入对应的字符。这样可以排除掉游戏本身的输入处理逻辑直接定位到传输环节。5.3 性能瓶颈的定位与优化AnyPS5 这套方案对硬件还是有一定要求的尤其是目标设备的解码能力。如果你发现画面卡顿但网络没问题那多半是解码跟不上。判断方法很简单打开任务管理器看 CPU 和 GPU 的占用。如果 CPU 某个核心跑满了那说明你在用软解如果 GPU 的视频解码引擎占用很高那说明硬解在工作。硬解和软解的差距有多大我实测过在同样的 1080p60 H.264 流下软解x264 解码在一个四核迷你主机上 CPU 占用约 60%而硬解Intel Quick SyncCPU 占用不到 5%。所以如果你的设备支持硬解一定要开启。FFmpeg 里用-hwaccel auto就能自动选择硬解。另一个容易被忽视的瓶颈是内存带宽。视频解码需要频繁读写内存如果内存带宽不够即使 GPU 支持硬解也会出现卡顿。这种情况在低功耗设备上比较常见比如某些 Atom 处理器的平板。解决办法是降低分辨率或者帧率减少内存带宽压力。6. 进阶玩法与扩展思路6.1 多目标设备同时输出AnyPS5 的架构天然支持一对多。你可以在目标设备上跑一个 RTSP 服务器把视频流转发给多个客户端。这样你可以在客厅的电视、书房的显示器、卧室的平板同时看到 PS5 的画面。当然输入回传只能有一个活动的手柄不然会打架。实现方法是在目标设备上用 FFmpeg 做转推ffmpeg -i rtsp://采集卡IP:554/stream -c copy -f rtsp rtsp://目标设备IP:8554/live1 ffmpeg -i rtsp://采集卡IP:554/stream -c copy -f rtsp rtsp://目标设备IP:8554/live2-c copy表示不重新编码直接复制流这样几乎不消耗 CPU。但注意如果多个客户端同时拉流带宽会成倍增加。1080p60 15 Mbps 的流三个客户端就是 45 Mbps千兆局域网完全扛得住。6.2 移动设备的适配如果你想把画面推到平板或者手机上事情会复杂一些。移动设备的解码能力参差不齐而且 Wi-Fi 稳定性不如有线。我的建议是在移动设备上把分辨率降到 720p码率降到 8 Mbps帧率保持 60fps。这样画质虽然有所下降但流畅度有保障。移动设备上的播放器选择也很重要。VLC 的延迟比较高不太适合。我推荐用 mpv它的低延迟模式做得很好。在 Android 上可以用 mpv-android在 iOS 上可以用 Outplayer。配置参数和桌面端类似关键是开启硬解和低延迟模式。6.3 录制与回放AnyPS5 的架构还有一个好处你可以在目标设备上同时录制视频流而不影响实时播放。因为视频流是独立的录制只是多了一个消费者。用 FFmpeg 一边播放一边录制ffmpeg -i rtsp://采集卡IP:554/stream -c copy -f mp4 output.mp4这样录下来的视频是无损的相对于原始流而且几乎不消耗额外 CPU。如果你想剪辑可以直接用这个文件。我试过连续录制两个小时文件大小约 13 GB完全在可接受范围内。7. 个人实操体会与建议这套方案我断断续续折腾了大概两个月中间换过三次采集卡重装过两次系统踩过的坑比预想的多得多。但跑通之后的那种成就感是直接买成品方案给不了的。我现在可以在书房用笔记本玩 PS5手柄一按就响应画面和直接接显示器几乎没区别。偶尔想躺床上玩就把流推到平板上虽然画质降了一点但躺着玩是真的舒服。如果你也想尝试我的建议是从最简单的配置开始。先用采集卡加 FFmpeg 推流跑通视频再说。输入回传可以先用键盘鼠标模拟确认视频没问题了再搞手柄。不要一上来就追求 4K 120Hz那只会让你在调试的泥潭里越陷越深。1080p60 已经能覆盖 95% 的使用场景而且硬件要求低得多。最后分享一个小技巧如果你觉得画面颜色不对先别急着调编码参数检查一下 PS5 的 RGB 范围设置。PS5 默认是“自动”但有时候会自动到“有限”范围导致画面发灰。手动设为“全范围”或者“RGB”就能解决。这个坑我踩过调了半天编码器最后发现是 PS5 设置的问题。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进