1. 从"AnyPS5"这个名字说起:它到底想解决什么问题
第一次看到"AnyPS5"这个标题,我脑子里蹦出来的第一个念头是:这大概率是一个围绕"通用化"和"PS5"这两个关键词做文章的项目。PS5本身是一台游戏主机,但"Any"这个前缀透露出一种野心——它想让某种能力、某种资源、某种体验,不再局限于PS5这一台设备本身,而是"任意设备都能沾上边"。
我接触过不少类似思路的项目,有的是做串流,有的是做手柄映射,有的是做存档同步,还有的是做画面增强。但不管具体方向是什么,"AnyPS5"这个命名背后一定藏着一个核心矛盾:PS5是一个封闭生态,它的硬件、系统、手柄协议、画面输出都有自己的一套规矩,而"Any"意味着要打破这套规矩,让非PS5的设备或者非官方的使用方式也能接入进来。
这个矛盾就是整个项目的价值锚点。你想想,为什么有人会需要"AnyPS5"?因为PS5虽然性能强、独占多,但它有几个天然的"不方便":你得坐在电视前,你得用它的手柄,你得在它的系统里操作。而现代人的使用习惯是碎片化的、多设备的、跨场景的。我想在电脑上玩,我想用自己习惯的手柄,我想把画面录下来做剪辑,我想在外面也能连回家里的主机——这些需求官方不一定都满足,或者满足得不够好。"AnyPS5"要做的,就是把这些"不方便"变成"方便"。
从技术层面看,这类项目通常会涉及几个核心模块:设备发现与连接、输入指令的转发与映射、音视频流的采集与编码、网络传输的优化、以及客户端的解码与渲染。每一个模块都有坑,每一个模块的选型都会影响最终的体验。比如输入转发,你是用蓝牙还是用USB?是用系统级驱动还是用应用层钩子?音视频采集,你是走采集卡还是走系统内部的画面捕获?网络传输,你是用局域网直连还是走公网中转?这些选择没有绝对的对错,只有适不适合你的场景。
我之所以对这个标题感兴趣,是因为它代表了一类非常典型的"逆向需求"——官方不给的,社区自己补。这类项目往往没有大厂的支持,全靠开发者自己摸索协议、自己优化延迟、自己处理兼容性。但正是这种项目,最能体现一个开发者的工程能力和对用户体验的理解。接下来我会从几个角度拆解这个项目可能涉及的技术点、实操步骤和避坑经验,不管你是想自己做一个类似的东西,还是想用现成的方案,都能从中找到有用的东西。
2. 拆解"Any"的三种可能路径:串流、映射与增强
"AnyPS5"这个标题里的"Any"到底指什么?我梳理了一下,大概有三种可能的技术路径,每一种对应的实现难度、使用场景和体验上限都不一样。你在动手之前,得先想清楚自己要的是哪一种。
2.1 路径一:把PS5的画面和声音"搬"到任意屏幕上
这是最常见的一种理解。PS5本身有官方的串流功能,但官方功能往往有限制:比如只能在同一个局域网内,比如只支持特定的客户端设备,比如画质和延迟不能自己调。而"AnyPS5"如果走这条路,目标就是打破这些限制,让PS5的画面能出现在任何一块屏幕上——电脑显示器、平板、手机,甚至是一台老旧的笔记本。
这条路的核心技术是音视频采集与编码。PS5的HDMI输出是加密的,你不能直接插一根线到电脑上就完事,中间必须经过一个采集设备。采集卡的作用就是把HDMI信号转换成电脑能识别的USB视频流。这里第一个坑就来了:采集卡的质量直接决定画质上限。便宜的采集卡往往只支持1080p60,而且色彩采样是4:2:0,画面里的红色文字边缘会糊成一团。如果你想要4K60甚至HDR,采集卡的价格会翻好几倍。
采集到画面之后,下一步是编码。编码的目的是压缩数据量,方便网络传输。这里的选择很多:H.264兼容性最好,H.265压缩率更高但对解码端要求也高,AV1是最新的但生态还不够成熟。我的经验是,如果你追求低延迟,H.264的硬件编码(比如用显卡的NVENC或者AMD的VCE)是最稳的,延迟可以压到几毫秒。如果你追求画质,那就得用软件编码(比如x264的veryfast预设),但CPU占用会上去。
编码完之后是传输。局域网内可以用UDP直接推流,配合前向纠错来对抗丢包。公网传输就复杂了,你得考虑NAT穿透、中继服务器、动态码率调整。我试过用WebRTC来做传输层,它的拥塞控制算法比较成熟,能根据网络状况自动调整码率,但配置起来比较麻烦,需要信令服务器和STUN/TURN服务器。
2.2 路径二:让任意手柄都能"伪装"成PS5手柄
这条路解决的是输入侧的问题。PS5的DualSense手柄有很多独特功能:自适应扳机、触觉反馈、触摸板、麦克风阵列。但这些功能在非PS5设备上往往用不了,或者用不全。反过来,你想用Xbox手柄或者Switch Pro手柄玩PS5游戏,官方也不支持。
"AnyPS5"如果走这条路,核心就是输入协议的转换与映射。你需要一个中间层,把其他手柄的输入信号翻译成PS5能识别的信号。这个中间层可以跑在电脑上,也可以跑在一个小型的硬件模块上。
技术上的难点在于:PS5对手柄的认证是有加密的。你不能随便发一个USB描述符就说自己是DualSense,PS5会拒绝。所以这类项目通常需要用到一些"特殊手段",比如从原装手柄里提取认证芯片,或者利用某些固件的漏洞。这里我就不展开说了,懂的都懂。
更实际的做法是走蓝牙映射。很多手柄都支持蓝牙,你可以用一个支持蓝牙的微控制器(比如ESP32)来接收手柄的蓝牙信号,然后通过USB或者网络把映射后的指令发给PS5。这种方案的延迟通常在10到20毫秒之间,对于大多数游戏来说是可以接受的,但格斗游戏或者音游玩家可能会觉得不够跟手。
2.3 路径三:在任意设备上"增强"PS5的体验
这条路比较抽象,但想象空间很大。比如:在PS5上录制高清视频并直接传到电脑做剪辑,而不需要经过采集卡;在PS5上使用自定义的宏指令或者脚本;把PS5的存档自动同步到云端或者本地NAS;甚至是在PS5上运行一些非官方的应用。
这类功能通常需要系统级的访问权限,而PS5的系统是封闭的,所以实现起来难度最高。有些项目会利用PS5的浏览器漏洞或者媒体播放器漏洞来执行自定义代码,但这些漏洞往往随着系统更新被修补,稳定性很差。如果你只是想做一些简单的自动化,比如定时截图、自动备份存档,可以考虑用HDMI采集卡配合电脑端的脚本来实现,虽然笨重但胜在稳定。
我个人的建议是:如果你只是想"在电脑上玩PS5",路径一最成熟,方案也最多;如果你是想"用自己的手柄玩PS5",路径二有现成的开源方案可以借鉴;如果你是想"折腾一些官方没有的功能",路径三需要你有比较强的逆向工程能力,而且要做好随时失效的准备。
3. 音视频链路的关键参数:延迟、画质与带宽的三角博弈
不管你走哪条路,只要涉及画面传输,就绕不开一个"不可能三角":低延迟、高画质、低带宽,你最多只能同时满足两个。这一章我会把这三个参数拆开讲,告诉你每个参数背后的技术细节和调优方法。
3.1 延迟是怎么产生的,以及怎么把它压下去
延迟是串流体验的命门。你按下手柄按钮,到画面上出现反应,这中间的时间差就是端到端延迟。对于动作游戏,超过50毫秒就能感觉到"不跟手";对于回合制或者策略游戏,100毫秒也能忍。
延迟的来源有很多:手柄输入采集(5-10ms)、输入信号传输(5-20ms)、游戏引擎处理(16-33ms,取决于帧率)、画面渲染(16-33ms)、画面采集(10-30ms)、编码(5-20ms)、网络传输(5-50ms)、解码(5-15ms)、显示(5-20ms)。你把这一串加起来,轻松就超过100毫秒了。
要压延迟,得从最大的那几个环节下手。采集环节,用采集卡比用系统内部捕获要快,因为采集卡是硬件直通,不经过操作系统的合成器。编码环节,用硬件编码比软件编码快,因为硬件编码器是专门为实时视频设计的,延迟可以做到个位数毫秒。网络环节,局域网比公网快,有线比无线快,5GHz Wi-Fi比2.4GHz快。解码环节,客户端如果有硬件解码器,一定要开启,软解不仅慢还费电。
我实测过的一组数据:PS5输出1080p60,采集卡采集,NVENC编码,局域网UDP传输,客户端硬解,端到端延迟大概在60到80毫秒之间。如果把采集卡换成4K60的型号,延迟会增加到100毫秒左右,因为数据量大了四倍,编码和传输的压力都上去了。
注意:延迟的测量方法很重要。你不能靠"感觉"来判断,得用高速摄像机拍下按钮按下和画面反应的瞬间,然后数帧数。或者用专门的延迟测试工具,比如LDAT或者慢动作模式。
3.2 画质不只是分辨率,还有色彩和动态范围
很多人一提到画质就只看分辨率,4K就比1080p好。但实际上,色彩采样和色深对观感的影响可能更大。PS5的HDMI输出默认是4:2:0的色彩采样,这意味着色度信息的分辨率只有亮度的一半。对于大多数游戏画面来说,这没什么问题,但如果你要看文本或者细线条,就会看到色彩边缘的模糊。
采集卡如果支持4:4:4采样,画面会锐利很多,但带宽需求也会翻倍。HDMI 2.1的带宽是48Gbps,4K60 4:4:4 10bit需要大概22Gbps,还在范围内。但很多采集卡只支持到HDMI 2.0,带宽只有18Gbps,4K60 4:2:0 8bit就已经接近上限了。
HDR是另一个维度。PS5支持HDR10和杜比视界,但采集卡和编码器对HDR的支持参差不齐。如果你要串流HDR内容,得确保整条链路都支持:采集卡支持HDR直通,编码器支持10bit色深,客户端支持HDR显示。任何一个环节不支持,HDR就会退化成SDR,画面会发灰。
我的建议是:如果你主要在显示器上玩,1080p60 4:4:4 SDR是最稳妥的选择,兼容性最好,延迟也最低。如果你要在大电视上玩,4K60 4:2:0 HDR可以试试,但要做好折腾的准备。
3.3 带宽估算:你的网络到底够不够用
带宽是很多人忽略的一个点。你可能觉得家里千兆局域网肯定够,但实际上串流的带宽需求比你想的要高。
以1080p60 H.264编码为例,如果你想要比较好的画质,码率至少要到20Mbps。4K60 H.265的话,码率要到50Mbps以上才能看得过去。这还只是平均码率,遇到快速运动的画面,瞬时码率可能会翻倍。如果你的网络有波动,或者有其他设备在下载,画面就会卡顿或者糊成马赛克。
局域网内,千兆有线是绰绰有余的。但如果你走Wi-Fi,就要看信号强度和干扰情况了。5GHz Wi-Fi在理想情况下能跑到400Mbps以上,但穿墙之后可能只剩100Mbps。而且Wi-Fi是半双工的,同一时间只能收或者发,延迟的抖动会比有线大很多。
公网串流的话,上行带宽是瓶颈。大多数家庭宽带的上行只有30Mbps到50Mbps,4K串流基本没戏,1080p也要看运气。如果你真的需要在外网玩,可以考虑降低分辨率和码率,比如720p60 10Mbps,体验会好很多。
| 分辨率 | 帧率 | 编码 | 推荐码率 | 延迟预期 | 适用场景 |
|---|---|---|---|---|---|
| 720p | 60 | H.264 | 8-12 Mbps | 40-60ms | 外网、移动网络 |
| 1080p | 60 | H.264 | 15-25 Mbps | 50-80ms | 局域网、有线 |
| 1080p | 120 | H.264 | 25-35 Mbps | 60-90ms | 高刷显示器、竞技游戏 |
| 1440p | 60 | H.265 | 30-40 Mbps | 70-100ms | 2K显示器 |
| 4K | 60 | H.265 | 50-80 Mbps | 90-130ms | 大屏电视、画质优先 |
这张表是我根据实际测试和经验估算的,你的具体数值可能会因为设备、网络和环境的不同而有差异。但大致的趋势是准的:分辨率和帧率越高,码率和延迟就越高。
4. 手柄映射的实操细节:从识别到校准的完整流程
手柄映射是"AnyPS5"项目里最容易被低估的一个环节。很多人觉得不就是把按键对应一下吗,有什么难的。但实际做起来,你会发现每个手柄的协议不一样,每个游戏的按键需求不一样,每个玩家的手感偏好也不一样。这一章我会把整个流程拆开,从识别手柄到校准死区,一步步讲清楚。
4.1 识别手柄:HID描述符与厂商ID的坑
当你把一个USB手柄插到电脑上,操作系统会读取它的HID描述符,然后根据厂商ID和产品ID来匹配驱动。问题在于,很多第三方手柄的HID描述符写得很不规范,有的甚至直接抄了Xbox手柄的ID,导致系统识别错误。
我在做一个映射工具的时候,遇到过一个典型问题:某款国产手柄在Windows上被识别成Xbox 360手柄,但按键映射完全不对,A键变成了B键,扳机键变成了摇杆。排查了半天才发现,它的HID描述符里报告的数据格式和Xbox 360完全不一样,只是厂商ID抄了微软的。
解决方法是:不要依赖系统的自动识别,而是自己解析HID报告。你可以用hidapi这样的库来直接读取原始报告,然后根据报告的长度和字节变化来推断每个按键和摇杆的位置。这个过程需要一些耐心,但一旦搞定,兼容性会好很多。
对于蓝牙手柄,情况更复杂。蓝牙HID协议有多个版本,有的手柄用经典蓝牙,有的用BLE。BLE的HID报告格式又和经典蓝牙不一样。如果你要同时支持多种手柄,建议用一个成熟的输入库,比如SDL或者GLFW,它们已经帮你处理了大部分兼容性问题。
4.2 映射策略:直通、重映射与宏指令
识别到手柄之后,下一步是决定怎么映射。最简单的策略是直通:手柄的A键就对应PS5的叉键,B键就对应圈键。这种策略适合大多数情况,但有一个问题:不同平台的按键布局不一样。Xbox手柄的A键在下方,任天堂手柄的A键在右方,PS5的叉键在下方。如果你直接按位置映射,任天堂手柄的用户会觉得别扭;如果你按标签映射,Xbox手柄的用户又会觉得别扭。
我的做法是提供一个映射配置界面,让用户自己选择。默认用位置映射,但允许用户手动调整。这个界面不需要很复杂,一个表格就行:左边是源手柄的按键,右边是目标按键,中间用下拉菜单选择。
重映射是更高级的需求。比如有些玩家喜欢把L3和R3(摇杆按下)映射到背键,因为摇杆按下会影响摇杆的操作精度。还有些玩家喜欢把扳机键的行程缩短,因为有些游戏的扳机键需要按到底才触发,手累。这些都可以通过映射层来实现。
宏指令是最复杂的一层。比如你想实现"一键连发",或者"一键触发组合技",就需要在映射层里加入脚本引擎。我试过用Lua来做脚本,因为Lua轻量、嵌入方便、语法简单。你可以定义一个宏,比如"按下A键时,每隔50毫秒发送一次A键信号,持续500毫秒",然后把这个宏绑定到某个按键上。
注意:宏指令在多人游戏里可能会被视为作弊,使用前请确认游戏的规定。我个人的建议是只在单人游戏里用,多人游戏还是老老实实手动操作。
4.3 死区与曲线:让摇杆手感接近原装
摇杆的死区和曲线是影响手感的关键参数。死区是指摇杆中心附近的一个区域,在这个区域内,摇杆的移动不会被识别。死区太小,摇杆会因为轻微晃动而产生漂移;死区太大,微调操作会变得困难。
PS5的DualSense手柄出厂死区大概在5%到8%之间,具体取决于批次。第三方手柄的死区往往更大,有的甚至到15%。如果你用第三方手柄玩PS5游戏,会发现瞄准很困难,因为摇杆的微调区间被死区吃掉了。
解决方法是:在映射层里加入死区补偿。你可以读取摇杆的原始值,然后应用一个反向的死区曲线,把被死区吃掉的范围"拉"回来。具体做法是:如果原始值在死区内,输出0;如果超出死区,把剩余范围重新映射到0到100%。这样可以让摇杆的有效范围变大,微调更精准。
曲线是另一个参数。默认的摇杆响应是线性的,但很多玩家喜欢非线性曲线,比如"S"形曲线,中心区域更平缓,边缘区域更陡峭。这样在瞄准时可以更精细,转身时又可以更快。你可以在映射层里加入一个曲线编辑器,让用户自己调整。
我实测下来,死区补偿加上轻微的S形曲线,可以让第三方手柄的手感接近原装DualSense的八成。剩下的两成主要是硬件差异,比如摇杆的阻尼和回中力度,这个软件层面很难完全弥补。
5. 网络传输的稳定性优化:从UDP到前向纠错的实战
网络传输是串流体验里最不可控的一环。你的编码再好,画质再高,网络一抖,全白搭。这一章我会讲几个实战中验证有效的优化手段,从协议选择到参数调优,都是可以直接抄作业的。
5.1 为什么UDP比TCP更适合实时串流
TCP是可靠传输,它会保证数据包按顺序到达,丢了就重传。听起来很好,但对于实时视频来说,重传是灾难。一个数据包丢了,TCP会停下来等它重传,后面的数据包即使已经到了也得排队。这一等,可能就是几百毫秒的卡顿。
UDP不保证可靠,丢了就丢了,但它不会阻塞后面的数据。对于视频流来说,丢一帧的代价远小于卡顿几百毫秒。所以实时串流几乎都用UDP。
但UDP也有问题:它不保证顺序,也不保证到达。你需要自己在应用层做一些补偿。常见的做法是给每个数据包加一个序列号,接收端根据序列号来排序和检测丢包。如果发现丢包,可以请求重传(但这又引入了延迟),或者直接用前向纠错来恢复。
5.2 前向纠错:用冗余换稳定
前向纠错(FEC)的原理很简单:在发送数据的时候,额外发送一些冗余数据。如果原始数据丢了,可以用冗余数据来恢复。比如你发送10个数据包,再发送2个冗余包,那么只要丢失不超过2个包,接收端就能恢复出完整的原始数据。
FEC的代价是带宽。你发送的冗余越多,抗丢包能力越强,但带宽消耗也越大。一般来说,10%到20%的冗余可以应对大多数网络抖动。如果丢包率超过20%,那说明网络质量太差,FEC也救不了,只能降低码率。
我在局域网里测试过,开启20%的FEC之后,即使有10%的随机丢包,画面也基本看不出卡顿。但如果不开启FEC,10%的丢包就会导致明显的花屏和卡顿。
5.3 动态码率调整:让编码器跟着网络走
动态码率调整是另一个重要的优化手段。它的思路是:接收端持续监测网络状况(丢包率、延迟抖动、可用带宽),然后把这些信息反馈给发送端,发送端根据反馈调整编码码率。
如果网络好,码率就上去,画质更好;如果网络差,码率就下来,保证流畅。这个反馈环路的响应速度很关键。如果调整太慢,网络已经卡了,码率还没降下来;如果调整太快,码率会频繁波动,画质忽好忽坏。
我试过用WebRTC的拥塞控制算法(比如Google的GCC),效果不错,但配置比较复杂。如果你不想自己实现,可以考虑用现成的串流方案,比如Sunshine加Moonlight,它们已经内置了动态码率调整。
提示:动态码率调整需要接收端和发送端都支持。如果你用的是现成的串流软件,记得在设置里开启这个功能。如果你自己写,建议先用简单的阈值控制,比如丢包率超过5%就降码率,低于1%就升码率,然后再慢慢优化。
6. 踩坑实录:那些让我熬夜排查的兼容性问题
做这类项目,最耗时间的不是写代码,而是排查各种奇怪的兼容性问题。这一章我分享几个我实际踩过的坑,以及排查的思路和方法。希望你看完之后能少走一些弯路。
6.1 采集卡在特定分辨率下的黑屏问题
我用的是一块支持4K60的采集卡,在1080p60下工作正常,但一切换到1440p就黑屏。排查了半天,发现是采集卡的EDID(扩展显示标识数据)没有正确报告1440p的支持。PS5读取EDID之后,发现采集卡不支持1440p,就拒绝输出这个分辨率。
解决方法是:用一个EDID模拟器,或者直接修改采集卡的EDID。有些采集卡提供了工具软件,可以自定义EDID。如果没有,可以买一个HDMI EDID模拟器,插在PS5和采集卡之间,让PS5以为连接的是一个支持所有分辨率的显示器。
这个坑的教训是:采集卡的兼容性不能只看参数表。参数表上写着支持4K60,但实际用起来可能在某些分辨率或者刷新率下有问题。买之前最好看看社区的评价,或者买支持退货的商家。
6.2 蓝牙手柄的延迟抖动与干扰
我用蓝牙手柄做映射的时候,发现延迟忽高忽低,有时候很跟手,有时候明显滞后。用频谱分析仪一看,发现2.4GHz频段被Wi-Fi和微波炉干扰得很厉害。
解决方法是:换用5GHz的Wi-Fi,或者把手柄换成有线连接。如果一定要用蓝牙,尽量让手柄和接收器之间没有遮挡,并且远离其他2.4GHz设备。另外,有些蓝牙适配器的天线设计不好,换个好一点的适配器也能改善。
还有一个坑是:Windows的蓝牙栈有时候会出问题,手柄会突然断开或者延迟飙升。重启蓝牙服务或者换一个第三方的蓝牙栈(比如BlueSoleil)可以解决,但第三方的蓝牙栈往往要收费。
6.3 编码器的色彩空间转换错误
我用硬件编码器的时候,发现画面颜色偏暗,黑色变成了深灰色。排查后发现是色彩空间转换的问题:PS5输出的是Limited Range(16-235),但编码器默认按Full Range(0-255)来处理,导致黑色被抬高了。
解决方法是:在编码器设置里指定输入是Limited Range,或者让采集卡做色彩空间转换。这个坑很隐蔽,因为画面不是完全黑或者完全白,只是对比度不对,不仔细看可能发现不了。
注意:色彩空间的问题在HDR内容里更明显。如果你串流HDR内容,一定要确保整条链路都正确处理了HDR的元数据,否则画面会发灰或者过曝。
7. 从零搭建一个最小可用原型:我的步骤和配置
如果你看到这里,想自己动手做一个"AnyPS5"的雏形,这一章我会给你一个最小可用的方案。这个方案不追求完美,但能让你在几个小时内跑通整个链路,看到画面从PS5传到电脑上。
7.1 硬件清单与连接方式
你需要的东西不多:一台PS5、一块采集卡、一台电脑、两根HDMI线。采集卡的选择很关键,我建议买支持UVC(USB Video Class)标准的,这样不需要装驱动,插上就能用。价格在几百块左右的采集卡通常就能满足1080p60的需求。
连接方式很简单:PS5的HDMI输出接到采集卡的HDMI输入,采集卡的USB输出接到电脑。如果你要用手柄映射,还需要一个USB蓝牙适配器或者有线手柄。
电脑的配置要求不高,但有几个点要注意:USB接口最好是USB 3.0以上,因为采集卡的数据量很大,USB 2.0的带宽不够。显卡最好支持硬件编码,NVIDIA的NVENC或者AMD的VCE都行,这样CPU占用会低很多。
7.2 软件栈的选择与配置
软件方面,我推荐用OBS Studio来做采集和编码,因为它免费、开源、插件多。在OBS里添加一个"视频采集设备"源,选择你的采集卡,然后设置分辨率和帧率。编码器选NVENC或者x264,码率设到20Mbps左右。
传输方面,如果你只在局域网内用,可以用OBS的"自定义输出"功能,把流推到本地的某个端口,然后用VLC或者ffplay来播放。如果你要更低的延迟,可以用Sunshine加Moonlight的组合,Sunshine负责采集和编码,Moonlight负责解码和显示,延迟可以压到50毫秒以内。
手柄映射可以用DS4Windows或者BetterJoy,它们支持多种手柄,并且可以模拟成PS5手柄。如果你要自己写映射逻辑,可以用Python的pygame库来读取手柄输入,然后用vgamepad或者ViGEm来模拟输出。
7.3 验证与调优的检查清单
跑通之后,你需要验证几个关键指标:延迟、画质、稳定性。延迟可以用高速摄像机来测,画质可以看文本是否清晰、色彩是否准确,稳定性可以连续跑一个小时看有没有卡顿或者断连。
如果延迟太高,先检查编码器是不是用了硬件编码,然后检查网络是不是有线连接。如果画质不好,检查采集卡的分辨率和色彩采样设置,以及编码器的码率和预设。如果稳定性差,检查USB接口是不是接触不良,或者采集卡是不是过热。
我自己的配置是:采集卡用某品牌的USB 3.0型号,OBS用NVENC编码,码率25Mbps,局域网有线连接,Moonlight客户端硬解。这套配置下,1080p60的端到端延迟大概在70毫秒左右,画质和稳定性都让我满意。
这个原型只是一个起点。你可以在此基础上加入动态码率调整、前向纠错、多客户端支持等功能。每加一个功能,都会带来新的挑战,但也会让体验更好。我在这个过程中最大的体会是:不要追求一步到位,先跑通最小闭环,然后再逐步优化。很多问题只有在实际跑起来之后才会暴露,提前设计太多反而会浪费时间。