先讲个真实场景:会议室里有人把笔记本接到无线投屏器上,画面延迟到鼠标拖影。他第一反应是“无线就是不行”。后来我们把同一套方案从90ms调到62ms,他还是觉得“卡”,但换到另一间会议室里一套50ms的方案,他一句话都没抱怨。人对延迟的感知就是这么敏感,而无线投屏的延迟,恰恰不是“无线”这一个环节决定的。
这套QCW5007+5004方案,标称60ms端到端延迟,实际跑下来在58~63ms之间。做这个项目时,我把HDMI无线投屏“从编码到显示”的每一段都拉出来量了一遍,发现60ms这个数字背后藏着一大堆可以抠的细节,也踩了不少坑。这篇文章就把这套链路拆开揉碎,说说每一毫秒都去哪了,哪些延迟可以优化、哪些你动不了,以及上电后“不支持”“黑屏”“花屏”这类问题该怎么沿着链路定位。
1. 60ms链路预算:60ms花在哪,先算清楚账再动手
1.1 人眼对60ms的感知,到底是个什么水平
在讲链路之前,得先明确60ms这个目标是不是合理。人眼对“延迟”的感知没有绝对阈值,它取决于画面内容的运动速度和交互性质。静态PPT翻页,150ms都没人抱怨;拖拽窗口、鼠标移动这种高频交互,60ms能感觉到轻微迟滞,但还不至于不可用;到了游戏、电子白板书写这类场景,60ms就偏高了。
这也是产品定位问题。QCW5007+5004这套方案把目标定在60ms,说明它更适合办公投屏、教学演示、视频播放这类场景,而不是主打零延迟游戏投屏。调试的时候我给自己定了一条线:只要能稳定做到60ms以内、且画面不出现可见卡顿,交互场景就能接受;超过80ms,用户在拖窗口时就能明显感知到“跟手度”变差。
1.2 链路四段的预算分配
一套无线HDMI投屏从源端信号进入到接收端显示,大致分为四段:HDMI采集与格式转换、视频编码、空口传输、解码与显示输出。我用抓包和示波器实测,把这四段的典型延迟分布列成了一张表:
| 链路阶段 | 典型延迟 | 主要延迟来源 |
|---|---|---|
| HDMI采集与格式转换 | 3~8ms | TMDS时钟恢复、行缓冲、格式缩放 |
| 视频编码 | 8~15ms | 编码器帧级缓冲、码控、GOP结构 |
| 空口传输 | 12~22ms | 帧打包、调度周期、排队、重传/FEC |
| 解码与显示输出 | 8~15ms | 解码缓冲、音画同步对齐、vsync等待 |
| 合计 | 31~60ms | 实际端到端约58~63ms |
注意这张表里的数字,和很多人直觉不一样:无线空口只占了不到三分之一,编码端反而是个大头。如果你要优化延迟,先从编码下手比折腾天线/路由器更有效。
1.3 端到端是流水线,不是四段串联累加
刚接触这套链路时我犯过一个认知错误:以为60ms就是“采集5ms + 编码15ms + 空口20ms + 解码15ms + 显示8ms”简单加起来。实际不是。
发射侧在编码第N帧时,第N-1帧已经打包在空中传输,第N-2帧已经在接收端解码。整条链路是流水线并行,端到端延迟是“同一帧从进入采集到输出显示的时间差”,它取决于单级处理时间加各级缓冲/排队时间之和,而不是所有节点处理延迟的简单累加。这就是为什么你把每一级都调快1ms,总延迟不一定只降4ms,有时降得更多,因为排队时间也会跟着变短;反过来,某一级缓冲设深了,下游全部跟着遭殃。
2. 发射端:HDMI输入采集与编码,前20ms的大头全在这
2.1 TMDS解码、EDID握手和CEA-861,几个你绕不开的协议细节
HDMI信号进到发射端芯片,第一件事是物理层TMDS解码:把三对差分数据通道上的像素数据和时钟恢复出来。这里有两个容易忽略的延迟点。
第一个是像素时钟恢复。HDMI源端的TMDS时钟是随信号一起传过来的,接收端要用CDR(时钟数据恢复)锁定这个时钟,PLL锁定需要时间,尤其是在分辨率或刷新率切换的时候,可能一次就要吃掉几十毫秒。这也是为什么投屏过程中一切换分辨率,画面会黑一下。
第二个是EDID握手。发射端上电后要读显示端的EDID,确认对方最高支持什么分辨率、什么刷新率、什么色彩空间。这里涉及CEA-861扩展块,它用VIC(Video Identification Code)声明支持的视频时序。如果CEA-861块写得有问题,或者HDMI源端不认里面的时序,就会出现“明明显示器支持1080p60,源端却只输出720p”这种怪现象。
HDCP也是一个隐藏延迟源。启用了HDCP 2.2握手之后,整个认证过程多几个来回,实测延迟会增加10~20ms。做无线投屏如果主要面向办公场景、不传输受保护蓝光内容,很多方案会把HDCP设成“尽力而为”,源端不强求时就不启用。这个要根据产品定位去权衡。
2.2 编码参数:B帧是低延迟的第一大敌
发射端芯片拿到HDMI像素流之后,会做缩放/格式转换,然后送进视频编码器。编码这一级对延迟的影响,很多时候比芯片算力还大。
先说B帧。B帧要做双向预测,需要等后面的帧到了才能解码,天然引入多帧延迟。低延迟编码的第一原则就是禁用B帧,全用P帧,编码器才能边收边出。我在调试时做过一次A/B对比:同一个QCW5007编码器,把B帧打开后延迟直接从62ms涨到78ms,涨的全是编码端缓冲。
再说GOP结构。I帧是完整的帧内编码,数据量通常是P帧的5~10倍。如果I帧间隔设得太短,比如30帧一个I帧,每秒钟就出现两次码率尖峰,在空口侧会造成周期性排队,延迟波动加大。低延迟场景建议把I帧间隔拉大到120甚至更长,只在信道切换、关键帧请求时才插入I帧。
切片(slice)也很关键。一帧图像切成4~8个切片并行编码,编码器就不用等整帧全部处理完才开始输出,延迟能从“帧级”降到“切片级”。QCW5007的编码器SDK里有两个参数最值得调:低延迟模式开关和切片数量。这俩配合禁用B帧,是发射端省延迟最直接的手段。
码率控制模式也要选。CBR码率平稳,空口排队稳,但复杂画面下画质会崩;VBR保画质但码率突发,延迟波动大。低延迟场景我建议用CBR,实在不行也得限制峰值码率,给空口留出余量。
2.3 分辨率切换引发的“握手风暴”,才是投屏不稳定的真凶
调这套方案时我踩过一个印象很深的坑:笔记本在扩展屏和复制模式之间切一次,投屏画面要黑2~5秒,严重时直接断连重连。刚开始怀疑是无线链路问题,抓包才发现是发射端和源端之间的EDID重协商引起的。
笔记本切换显示模式时,显卡会重新读取HDMI源的EDID,然后重新设置输出时序。此时发射端采集分辨率变了,编码器要重新创建编码上下文,分辨率/帧率重新协商,整个链条像被推倒重来一遍。这个过程没法完全避免,但可以优化:发射端做EDID欺骗,给源端一个固定且稳定的EDID,把输出分辨率锁死在1080p60;再在编码器侧做分辨率白名单,只允许少数几个预设分辨率切换,避免编码器频繁重建。
如果你在调自己的产品,我强烈建议在发射端固件里加一个“EDID锁定模式”。这个功能在量产投屏器里几乎必备,能解决大量“投屏不稳定”投诉。
3. 空中传输:空口18ms里有什么,丢包重传怎么权衡
3.1 为什么不用标准Miracast,而用私有协议
无线投屏业界有两条技术路线:基于标准Miracast/Wi-Fi Direct的通用方案,和收发芯片同厂的私有协议方案。QCW5007+5004走的是后者。
Miracast的链路很长:Wi-Fi Direct协商、RTSP信令、媒体流封装,会话建立慢不说,数据面每一包都有大量协议头开销,端到端延迟普遍在80~150ms。私有协议不一样,收发两端都是自家芯片,信令可以做到极简,媒体面甚至可以完全绕过标准协议栈,用自定义分片直接怼到Wi-Fi MAC层。实测下来,私有协议的会话建立时间能控制在几百毫秒,数据面调度周期做到8ms一帧,空口延迟稳定在15~20ms。
3.2 一帧视频帧要占多大空口带宽,怎么算
很多人觉得无线投屏卡是带宽不够,其实算下来根本不是这么回事。以1080p60为例,HDMI输入原始带宽约3.2Gbps,编码成H.264/HEVC后码率通常压到20~40Mbps。按25Mbps算,一帧P帧大概52KB,I帧大一点可能200KB。
空口侧,80MHz频宽的802.11ac物理层速率能到400Mbps以上,实际好环境下有效吞吐200Mbps左右。一帧P帧传输时间大概2~7ms,加上8ms的调度周期、排队等待和协议开销,空口这一段做到15~20ms是完全可行的。所以空口不是瓶颈,编码输出码率的平稳性才是。
3.3 重传与FEC:画质和延迟永远是矛盾体
无线链路不管怎么优化都有丢包。丢包了怎么办?两条路:ARQ重传和前向纠错FEC。
ARQ的缺点是等重传要多等一个RTT,延迟至少多5ms。FEC的缺点是要多占带宽,一般要增加5%~10%码率预算,但不需要等待,接收端直接用冗余数据恢复,不增加延迟。实际方案里最优解是“混合策略”:关键数据(I帧、切片头、PPS/SPS)用FEC高冗余保护,普通P帧数据允许选择性重传。这样大部分丢包在接收端本地就能恢复,只有极端情况才触发重传。
我实测过一个规律:信道质量好(丢包率低于0.1%)的时候,关掉FEC能省1~2ms延迟;信道差(丢包率高于1%)的时候,盲目调高FEC冗余还不如降低码率来得实际,因为冗余本身也会挤占带宽、加大排队。
3.4 码率自适应:反馈延迟决定了它不能“太快”
接收端统计丢包率之后要通过反馈信道告诉发射端调整码率,这个反馈链路至少一个RTT。所以无线环境突然恶化时,码率还没来得及降,空口队列已经堆起来了。低延迟方案里,自适应反馈的带宽要设小一点,靠RSSI/CSI等物理层信息做前置判断,比依赖解码端统计更快。
4. 接收端:解码缓冲、时钟恢复和显示刷新,最后一道闸门
4.1 解码器为什么不能把缓冲设为0
接收端拿到无线数据包后,先重组完整帧,再送硬解。这里有个绕不开的矛盾:无线网络天然存在抖动,平均延迟18ms不代表每一帧都稳定在18ms,可能某一帧瞬时冲到30ms。解