1. 从“AnyPS5”这个标题说起:一个跨平台游戏串流方案的设计初衷
第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个折腾远程游戏串流的项目。果不其然,翻了一圈社区讨论和零散的技术片段之后,基本可以确认——这是一个围绕“把主机游戏画面串流到任意设备上”展开的实践方案。核心诉求很朴素:主机放在客厅,人却想在书房、卧室甚至外面用笔记本、平板、手机接着玩,不想搬机器,也不想被一根HDMI线拴死。
这类需求其实存在很多年了。早些年大家用采集卡加推流软件,延迟高、画质糊、配置繁琐,一套下来成本不低。后来主机厂商自己也出了官方串流功能,但限制不少——比如只支持特定设备、特定网络环境,码率和分辨率也卡得比较死。AnyPS5这个标题里的“Any”两个字,恰恰点出了它的野心:不挑设备,不挑平台,只要能跑得动解码,就能当屏幕用。
我之所以对这个方向感兴趣,是因为它踩中了几个很实际的技术点。第一是低延迟编码,主机端要把画面实时压成视频流,编码器选型、码率控制、关键帧间隔都会直接影响手感。第二是网络传输,局域网内还好说,一旦跨网段或者走公网,NAT穿透、带宽抖动、丢包重传这些问题全冒出来了。第三是客户端解码与渲染,不同设备的硬件解码能力天差地别,有的支持H.265硬解,有的只能软解,怎么适配是个体力活。
这篇文章适合谁看?如果你手里有一台主机,又恰好有多台闲置屏幕设备,想折腾一套属于自己的串流方案,那这篇内容应该能帮你少走不少弯路。如果你只是好奇“这玩意儿到底怎么实现的”,我也会把背后的原理拆开讲清楚。整篇内容基于社区里常见的实践路径来展开,涉及具体参数和步骤的地方,我会说明这是基于常见做法的合理补全,你实际动手时可以根据自己的设备情况调整。
2. 整体架构设计:为什么选择“主机编码+网络推流+客户端解码”这条路线
2.1 三种主流串流路线的取舍分析
在动手之前,先把技术路线想清楚,比后面遇到问题再回头改要省事得多。目前市面上能实现主机游戏串流的方案,大致可以归为三类。
第一类是硬件采集卡方案。主机HDMI输出接到采集卡,采集卡通过USB连到电脑,电脑上用OBS之类的软件预览并重新编码推流。这套方案的好处是兼容性极强,任何有HDMI输出的设备都能用,而且采集卡负责第一步的模数转换,电脑只负责编码和推流。但缺点也很明显:多了一次编解码,延迟天然比直连高出一截;采集卡本身有成本,好一点的支持4K60帧环出的卡价格不菲;而且整套系统绑死在电脑上,想用平板玩还得再串一道。
第二类是官方串流功能。主机厂商自带的远程游玩功能,通常优化得不错,延迟和画质平衡得比较好。但限制在于:官方一般只给自家生态的设备用,比如特定型号的手机、平板或者电脑客户端。你想在Linux上跑?想用第三方手柄?想自定义码率?基本没戏。而且官方功能往往依赖厂商的服务器做中转,网络环境稍微复杂一点就连不上。
第三类就是AnyPS5这类自建串流方案。核心思路是:主机端直接调用系统提供的编码接口,把画面压成视频流,通过局域网或者公网直接推给客户端,客户端解码后渲染显示。中间不经过采集卡,也不依赖厂商服务器。这条路线的好处是延迟可以压得很低,画质和码率完全自己掌控,客户端设备只要解码能力够,什么平台都能跑。代价嘛,就是配置门槛高一些,网络环境需要自己调优。
我最终倾向于第三条路线,理由很简单:延迟和自由度。采集卡方案多一道转换,官方方案少一份自由,自建方案虽然折腾,但一旦跑通,体验是最接近“本地直连”的。
2.2 核心模块拆解与数据流向
把自建串流方案拆开来看,其实就三个核心模块:采集与编码、网络传输、解码与渲染。
采集与编码在主机端完成。主机系统通常提供某种形式的屏幕捕获接口,拿到原始画面帧之后,交给硬件编码器(比如H.264或H.265编码芯片)压缩。这里的关键参数是码率、分辨率、帧率和编码预设。码率越高画质越好,但网络压力越大;编码预设越偏向“速度”,延迟越低,但同码率下画质会差一些。一般局域网内串流,1080P60帧的话,15到25Mbps的码率就够用了,再高的话普通千兆局域网虽然吃得下,但WiFi环境可能扛不住。
网络传输环节,局域网内最简单,主机和客户端在同一个网段,直接UDP推流就行。UDP的好处是不用等重传,丢一两个包画面花一下,但不会卡顿累积。如果用TCP,丢包重传会导致延迟越积越高,手感直接崩掉。跨网段或者走公网的话,就需要考虑NAT穿透或者端口映射,这部分后面会细说。
解码与渲染在客户端完成。客户端收到视频流后,先解封装,拿到压缩帧,然后交给硬件解码器或者软件解码器。硬件解码功耗低、延迟小,但兼容性看设备;软件解码兼容性好,但CPU占用高,低配设备可能跑不动。解码后的画面帧再交给渲染层显示,同时客户端还要把手柄输入回传给主机,形成一个闭环。
2.3 为什么延迟是核心指标,以及如何量化
串流方案好不好用,延迟是决定性因素。我习惯把端到端延迟拆成四段:采集延迟、编码延迟、网络传输延迟、解码渲染延迟。
采集延迟通常很小,几毫秒级别,除非主机系统本身有合成开销。编码延迟跟编码器实现有关,硬件编码器一般能在5到15毫秒内完成一帧的压缩,软件编码器可能要到20到40毫秒。网络传输延迟在局域网内可以控制在1到3毫秒,WiFi环境下波动大一些,5到20毫秒都算正常。解码渲染延迟跟客户端性能有关,硬件解码5到10毫秒,软件解码可能15到30毫秒。
加起来,一套调优良好的局域网串流方案,端到端延迟可以做到30到50毫秒。这个数字是什么概念呢?人眼对画面延迟的感知阈值大概在50到80毫秒左右,低于这个范围,大部分情况下感觉不到明显滞后。但如果你玩的是节奏游戏或者格斗游戏,那对延迟的要求就苛刻得多,最好能压到20毫秒以内。
注意:延迟不是越低越好,还要看稳定性。偶尔一次低延迟但频繁抖动,体验比稳定在40毫秒要差得多。调优的目标是让延迟曲线尽量平直。
3. 主机端配置:编码参数怎么调,才能兼顾画质和延迟
3.1 编码器选型:硬件编码优先,但要看具体支持
主机端编码是整个链路的第一环,选错了编码器,后面怎么调都白搭。目前常见的硬件编码方案有几种,不同平台叫法不一样,但底层原理大同小异。
如果你用的是某款主流主机,它内部通常集成了专用的视频编码单元。这类编码单元的特点是低延迟、低功耗,但参数可调范围比较窄。你一般只能控制码率、分辨率和帧率,像GOP结构、B帧数量这些高级参数,系统不一定开放给你。
我的建议是:优先用硬件编码,除非你有特殊需求。硬件编码的延迟优势太明显了,软件编码在主机那点CPU性能下,很容易成为瓶颈。实测下来,同一台主机,硬件编码端到端延迟能比软件编码低15到20毫秒,这个差距在动作游戏里是能感觉出来的。
如果系统提供了编码预设选项,一般会有“速度优先”“平衡”“画质优先”几档。串流场景下,选速度优先或者平衡,别选画质优先。画质优先预设会启用更复杂的运动估计和率失真优化,编码一帧的时间可能翻倍,延迟直接起飞。
3.2 码率、分辨率、帧率的三角平衡
这三个参数是相互制约的。分辨率越高,同样画质需要的码率越高;帧率越高,每秒要压的帧数越多,编码压力越大。你得根据网络带宽和客户端解码能力来定。
先看分辨率。1080P是目前最稳妥的选择,兼容性好,码率需求适中。如果你的客户端是4K屏幕,主机也支持4K输出,那可以试试1440P或者4K,但码率至少要翻倍。我试过在千兆局域网里跑4K60帧,码率拉到50Mbps,画质确实细腻,但WiFi客户端根本扛不住,最后还是退回1080P。
帧率方面,60帧是底线。30帧在快速转视角的时候会有明显的顿挫感,串流体验大打折扣。如果主机性能足够,客户端也支持高刷新率,可以试试120帧,但码率得再往上加,而且编码延迟会略微增加。
码率的选择有个经验公式:码率(Mbps)≈ 分辨率像素数 × 帧率 × 运动系数 ÷ 1000000。1080P的像素数约200万,60帧,运动系数取0.1到0.15,算下来就是12到18Mbps。实际设置的时候,我会在这个基础上留30%余量,设成20到25Mbps,应对复杂场景的码率波动。
| 分辨率 | 帧率 | 推荐码率范围 | 适用网络环境 |
|---|---|---|---|
| 720P | 60 | 6-10 Mbps | 百兆局域网、5G WiFi |
| 1080P | 60 | 15-25 Mbps | 千兆局域网、WiFi 6 |
| 1440P | 60 | 25-40 Mbps | 千兆局域网有线 |
| 1080P | 120 | 25-35 Mbps | 千兆局域网有线 |
| 4K | 60 | 40-60 Mbps | 2.5G局域网有线 |
3.3 关键帧间隔与B帧:延迟敏感场景下的取舍
关键帧间隔(GOP长度)是个容易被忽略但影响很大的参数。关键帧是完整编码的帧,不依赖其他帧就能解码;非关键帧只编码变化部分,体积小但依赖前面的帧。GOP越长,压缩效率越高,但一旦丢包,花屏持续时间也越长。
串流场景下,我一般把GOP设成1到2秒。太短了压缩效率低,码率浪费;太长了丢包恢复慢,而且客户端 seeking 的时候要等更久。有些方案支持动态GOP,网络好的时候拉长,网络差的时候缩短,这个特性如果有就打开。
B帧的问题更微妙。B帧是双向预测帧,能显著提升压缩效率,但解码顺序和显示顺序不一致,需要额外的缓冲来重排序。这个缓冲会引入延迟。延迟敏感的场景下,建议关闭B帧或者只保留1个B帧。我实测过,关闭B帧后,同码率下画质下降大概10%到15%,但延迟能降低5到8毫秒。对于格斗游戏或者音游来说,这个交换是值得的。
提示:不同主机系统对GOP和B帧的开放程度不一样。如果系统不给你调,那就只能在码率和分辨率上找平衡。别为了调参数去折腾非官方固件,风险太大。
3.4 音频编码的同步处理
视频调好了,别忘了音频。音频编码延迟通常比视频低,但音画同步是个坑。如果音频比视频快,你会感觉声音“提前”了;如果音频比视频慢,又感觉声音“拖后腿”。
常见的做法是:音频编码用低延迟的AAC或者Opus,帧长设成20毫秒或者40毫秒。然后在客户端做同步,以视频时间戳为基准,音频时间戳对齐过去。如果客户端支持,开启音频的“低延迟模式”,关闭任何后处理效果,比如均衡器、环绕声虚拟化,这些都会引入额外延迟。
我遇到过音频断断续续的问题,排查下来是音频缓冲区设得太小,网络稍微一抖动就欠载。后来把缓冲区从50毫秒加到100毫秒,断音没了,但音画同步偏移了大概30毫秒。解决办法是在客户端加一个动态同步逻辑,根据音频缓冲区的填充程度微调播放速度,慢慢把偏移拉回来。这个逻辑很多现成的串流客户端已经内置了,自己写的话要费点功夫。
4. 网络传输层:局域网直连与跨网段穿透的实操细节
4.1 局域网直连:最简单也最稳定的方案
如果主机和客户端都在同一个路由器下面,那事情就简单了。主机开一个UDP端口,客户端直接往这个端口发请求,主机把视频流推过去。中间不经过任何服务器,延迟最低,带宽最充裕。
这里有几个细节要注意。第一是端口选择,别用那些常见的被占用的端口,比如80、443、8080。选一个高位端口,比如50000以上的,减少冲突概率。第二是防火墙规则,主机系统的防火墙可能会拦截入站UDP包,你得手动放行。第三是IP地址稳定性,如果主机是DHCP获取IP,路由器重启后IP可能变,客户端就连不上了。建议在路由器里给主机绑定一个静态IP,或者在主机上设固定IP。
WiFi环境下,尽量用5GHz频段,2.4GHz的带宽和抗干扰能力都不够看。如果路由器支持WiFi 6,那更好,OFDMA和MU-MIMO能显著降低多设备干扰。但即便如此,WiFi的抖动还是比有线大。我实测过,同样的1080P60帧20Mbps流,有线连接的延迟标准差在1毫秒以内,WiFi 6环境下能到3到5毫秒,WiFi 5环境下可能到8到10毫秒。如果你追求极致稳定,主机端尽量走有线,客户端如果实在不方便拉线,再考虑WiFi。
4.2 跨网段访问:端口映射与中继转发
如果客户端不在同一个局域网,比如你在外面用笔记本连家里的主机,那就需要跨网段访问。最直接的办法是端口映射:在路由器上把主机的UDP端口映射到公网IP,客户端直接连公网IP加端口。
但端口映射有几个前提:你得有公网IP,很多宽带运营商现在默认给的是内网IP,根本没法映射;你得知道家里的公网IP,而且这个IP可能会变,需要配合动态DNS;你还得考虑安全风险,把主机端口暴露在公网上,万一被扫描到,可能被恶意连接。
如果端口映射走不通,那就只能走中继转发。找一台有公网IP的服务器,主机和客户端都连到这台服务器上,由服务器转发视频流。中继的好处是不用折腾NAT,坏处是多了一跳,延迟增加,而且服务器带宽要够,不然画质得降。我试过用一台低配云服务器做中继,1080P60帧的流,服务器带宽5Mbps根本不够,画面糊成马赛克。后来换成按流量计费的服务器,带宽拉到50Mbps,才勉强能看,但延迟比局域网直连高了20到30毫秒。
注意:中继方案下,视频流经过公网传输,建议开启端到端加密。虽然串流内容本身可能没什么敏感信息,但加密能防止中间人篡改或者注入。
4.3 带宽估算与拥塞控制
带宽估算是个动态过程。刚开始串流的时候,你不知道当前网络能承载多少码率,设高了会丢包卡顿,设低了画质浪费。比较好的做法是从低码率开始,逐步往上探。
具体操作:先设一个保守的码率,比如10Mbps,跑个几分钟,观察客户端的接收速率和丢包率。如果丢包率低于0.1%,说明带宽有富余,可以把码率提高20%,再跑几分钟。重复这个过程,直到丢包率开始上升,然后回退到上一个稳定的码率。这个探测过程可以在串流开始的时候自动做,也可以手动调。
拥塞控制方面,UDP本身没有拥塞控制,你得在应用层做。简单的做法是基于接收端的反馈调整发送速率:客户端定期把接收速率和丢包率回传给主机,主机根据这些信息调整编码码率。复杂一点的做法是借鉴WebRTC的拥塞控制算法,比如Google的BBR或者GCC,但这些算法实现起来门槛不低。如果不想自己写,可以看看有没有现成的串流库内置了这些逻辑。
4.4 丢包恢复与抗抖动缓冲
网络不可能永远不丢包,关键是丢了之后怎么快速恢复。视频流里,关键帧丢了最麻烦,因为后面的非关键帧都解不了。常见的做法是前向纠错(FEC):发送端在原始数据里加入冗余校验包,接收端丢了一部分包也能恢复出来。FEC的代价是额外带宽开销,一般加10%到20%的冗余。
另一个手段是重传,但只对关键帧重传,非关键帧丢了就丢了,等下一个关键帧。这样既能保证画面不长时间花屏,又不会因为重传导致延迟累积。
抗抖动缓冲在客户端做。收到的视频包先放进缓冲区,按时间戳排序,然后匀速取出来解码。缓冲区大小要动态调整:网络好的时候缩小,降低延迟;网络差的时候放大,吸收抖动。我一般把缓冲区下限设成20毫秒,上限设成100毫秒,根据实时抖动情况在中间浮动。
5. 客户端适配:不同设备上的解码与渲染实践
5.1 硬件解码能力摸底与回退策略
客户端设备五花八门,有Windows笔记本、MacBook、Android平板、iPad、甚至Linux小主机。每台设备的硬件解码能力都不一样,你得先摸清楚。
Windows平台上,可以用DXVA Checker之类的工具查看支持的解码格式。一般来说,近五年的Intel核显和NVIDIA/AMD独显都支持H.264和H.265的硬件解码,但H.265的10bit或者4:4:4采样可能不支持。Mac平台上,VideoToolbox框架提供了硬件解码接口,但支持的格式取决于芯片型号,M系列芯片的解码能力比Intel时期的Mac强不少。Android和iOS平台上,MediaCodec和VideoToolbox是标准接口,但不同厂商的实现质量参差不齐,有些设备标称支持H.265硬解,实际跑起来发热降频。
我的策略是:优先尝试硬件解码,失败则回退到软件解码。软件解码用FFmpeg的软解器,兼容性最好,但CPU占用高。1080P60帧的H.264流,软件解码大概需要2到3个CPU核心,如果客户端是低功耗平板,可能跑不动。这时候就得降低分辨率或者帧率,或者换用更高效的编码格式,比如H.265,同画质下码率能省30%到40%,软解压力也小一些。
5.2 渲染延迟优化:垂直同步与帧队列
解码出来的帧要渲染到屏幕上,这里也有延迟优化的空间。最大的坑是垂直同步(VSync)。开启VSync能防止画面撕裂,但会引入额外的缓冲延迟,通常增加10到20毫秒。串流场景下,我建议关闭VSync,接受轻微的撕裂,换取更低的延迟。如果撕裂实在影响观感,可以试试自适应同步技术,比如G-Sync或者FreeSync,前提是显示器和显卡都支持。
帧队列深度也要控制。有些渲染引擎默认会缓冲2到3帧再显示,这在本地游戏里没问题,但串流场景下就是纯延迟。把帧队列设成1,解码一帧就渲染一帧,延迟最低。代价是如果解码速度波动,画面可能会卡顿。折中方案是设成2,留一点缓冲余地。
5.3 输入回传:手柄与键鼠的映射逻辑
串流不只是看,还要能操作。客户端得把手柄或者键鼠的输入事件捕获下来,打包回传给主机。这部分延迟也要控制,但通常比视频链路简单,因为输入数据量很小,几十字节一个包,网络压力可以忽略。
手柄映射方面,不同客户端平台的API不一样。Windows上用XInput或者DirectInput,Linux上用evdev,Android上用InputDevice。捕获到事件后,统一转成主机能识别的格式,比如虚拟手柄的HID报告。键鼠映射稍微麻烦一点,因为主机游戏通常是为手柄设计的,键鼠的鼠标移动要转成右摇杆的模拟量,键盘按键要映射到对应的手柄按钮。这个映射逻辑可以做成可配置的,让用户自己调灵敏度和死区。
提示:输入回传的包建议用单独的通道,别和视频流混在一起。视频流是大包、低频率,输入是小包、高频率,混在一起容易互相干扰。分开之后,输入延迟可以稳定在5毫秒以内。
5.4 跨平台客户端的打包与分发
如果你想让方案在多个平台上跑,打包是个体力活。Windows上可以用MSI或者便携版zip,Mac上要签名和公证,Linux上可以打deb和rpm包,Android上要APK,iOS上要IPA。每个平台的依赖库和运行时都不一样,交叉编译的坑不少。
我的建议是:先在一个平台上跑通,再考虑移植。比如先在Windows上把整个链路调通,然后再把客户端代码往其他平台搬。核心逻辑用跨平台的库来写,比如FFmpeg做解码,SDL做渲染和输入,这样移植的时候只需要改平台相关的胶水代码。打包脚本可以用CI工具自动化,每次提交代码自动构建各平台的安装包,省得手动折腾。
6. 常见问题与排查技巧实录
6.1 画面卡顿但网络延迟正常,问题出在哪
这种情况我遇到过好几次,网络延迟测下来只有几毫秒,丢包率也接近零,但画面就是一顿一顿的。排查下来,原因通常有三个。
第一个是客户端解码性能不足。硬件解码没启用,软件解码又跑不满帧,解码队列越积越长,最后要么丢帧要么延迟暴涨。解决办法是检查硬件解码是否真的生效,用任务管理器或者性能监视器看CPU和GPU占用。如果GPU解码单元占用很低,CPU占用很高,那说明硬解没起作用,得查驱动或者解码器配置。
第二个是渲染帧率与视频帧率不匹配。比如视频是60帧,显示器是59.94Hz,每帧的显示时间对不齐,就会周期性丢帧或者重复帧。解决办法是把显示器刷新率设成和视频帧率一致,或者开启自适应同步。
第三个是主机端编码器过载。编码器如果跑不过来,会丢帧或者降低画质。检查主机端的编码器占用率,如果接近100%,那就得降低分辨率、帧率或者换更快的编码预设。
6.2 手柄输入延迟高,操作跟手性差
输入延迟高,先确认是视频延迟还是输入延迟。简单测试方法:在主机上打开一个能显示按键反馈的界面,按一下手柄,看画面里的反馈延迟多久。如果视频延迟正常但输入反馈慢,那就是输入链路的问题。
常见原因有:输入事件在客户端被缓冲了,比如有些框架默认会攒一批事件再发送;网络传输用了TCP,丢包重传导致延迟累积;主机端处理输入事件的线程优先级太低,被其他任务挤占了。解决办法:输入事件立即发送,别缓冲;输入通道用UDP;主机端把输入处理线程的优先级调高。
6.3 音画不同步的几种典型表现与修复
音画不同步有三种表现:声音超前、声音滞后、声音断续。声音超前通常是音频缓冲区太小,或者音频时钟比视频时钟快。解决办法是加大音频缓冲区,或者在客户端做动态重采样,把音频时钟慢慢拉回来。声音滞后一般是视频解码延迟大,音频等不及了先播了。解决办法是优化视频解码,或者把音频也延迟同样的时间。声音断续则是缓冲区欠载,网络抖动或者CPU抢占导致的,加大缓冲区通常能缓解。
| 问题表现 | 可能原因 | 排查手段 | 解决方向 |
|---|---|---|---|
| 声音超前 | 音频缓冲小、时钟快 | 检查音频缓冲深度 | 加大缓冲、动态重采样 |
| 声音滞后 | 视频解码慢 | 检查解码耗时 | 优化解码、同步延迟 |
| 声音断续 | 缓冲欠载 | 检查CPU和网络抖动 | 加大缓冲、降低码率 |
| 画面卡顿 | 解码或渲染瓶颈 | 看CPU/GPU占用 | 启用硬解、关VSync |
| 输入延迟 | 事件缓冲、TCP重传 | 测输入回传耗时 | 立即发送、用UDP |
6.4 跨网段连接失败的排查清单
跨网段连不上,按这个顺序查:先确认主机端防火墙有没有放行端口;再确认路由器有没有做端口映射,映射的IP和端口对不对;然后确认公网IP是不是真的公网,有些宽带给的是内网IP,映射了也没用;最后确认客户端能不能ping通公网IP,如果ping不通,那是路由问题,跟串流无关。
如果端口映射走不通,试试中继方案。中继服务器要选带宽足够的,不然画质没法看。中继的延迟比直连高,但至少能连上。如果中继也连不上,那可能是服务器防火墙或者安全组规则没配好,检查入站和出站规则。
6.5 长时间串流后的性能衰减与散热问题
连续串流一两个小时后,画面开始卡顿,延迟升高,这通常是散热问题。主机端编码器长时间满载,芯片温度升高,触发降频保护,编码能力下降。客户端解码器也一样,尤其是手机和平板,被动散热,温度一高就降频。
解决办法:主机端确保通风良好,别放在密闭空间里;客户端如果发烫,可以加个散热背夹,或者降低解码负载,比如从H.265换成H.264,从1080P降到720P。另外,串流过程中可以定期检查温度,如果接近阈值,主动降一档画质,别等系统强制降频。
7. 一些实操心得与后续可扩展的方向
折腾这套方案的过程中,我最大的体会是:瓶颈往往不在你最先怀疑的地方。一开始总觉得网络是瓶颈,后来发现编码器参数没调对;调完编码器又觉得客户端解码不行,结果发现是渲染的VSync没关。每次排查都像剥洋葱,一层一层往里找。
另一个心得是:别追求一步到位。先把最基本的链路跑通,哪怕画质糊一点、延迟高一点,至少能玩。然后再逐个环节优化,每次只改一个参数,改完测一遍,记录数据。这样出了问题也知道是哪个改动导致的。我见过有人一上来就把所有参数拉满,结果连不上,然后到处问,根本没法定位。
后续如果想继续扩展,有几个方向可以考虑。一是多客户端同时连接,主机端把视频流复制多份推给不同客户端,适合家里多人同时玩。二是动态码率自适应,根据网络状况实时调整编码参数,这个需要比较精细的拥塞控制算法。三是云主机串流,把主机端也搬到云上,客户端只负责解码和输入,这样连主机硬件都不用买了,但对云服务商的GPU实例和网络带宽要求很高。
最后分享一个小技巧:串流的时候把主机的HDR关掉。HDR转SDR的映射在串流链路里很容易出问题,要么颜色发灰,要么过曝。除非你的客户端和整个链路都支持HDR端到端,否则关掉HDR能省不少事。我试过开着HDR串流,画面颜色怎么调都不对,关掉之后立刻正常了。