2. 视频编码基础
在WebRTC中讨论H264与H265的适配,必须先回到视频编码本身。WebRTC负责“把媒体可靠、低延迟地送达对端”,而编码器负责“把原始画面压缩成可传输的码流”。H264(AVC)与H265(HEVC)是两代主流视频编码标准,它们都建立在“去除冗余”这一核心思想上,但在块划分、预测、变换和并行工具上差异明显。理解这些差异,才能判断在浏览器、移动端、SVC、硬件编解码和带宽受限场景下,应该选择哪一种编码,以及如何配置GOP、码率、关键帧和参数集。
一、核心原理:从空间冗余到时间冗余
视频编码的本质是压缩。原始YUV视频存在大量冗余:同一帧内相邻像素高度相关,称为空间冗余;相邻帧之间画面内容相似,称为时间冗余;人眼对亮度敏感、对色度不敏感,称为视觉冗余。H264与H265都采用“预测+变换+量化+熵编码”的混合编码框架:先通过帧内预测或帧间预测得到残差,再对残差做整数变换和量化,最后用熵编码压缩系数。区别在于,H265把编码单元划分得更细、预测方向更多、变换尺寸更灵活,从而在相同画质下节省约30%~50%码率。
一句话理解:H264用“宏块+有限方向预测”压缩画面;H265用“四叉树编码树+更多预测模式+更灵活变换”进一步逼近画面真实结构,因此压缩效率更高,但计算复杂度也更高。
二、关键术语:GOP、I/P/B帧、SPS/PPS、VPS
要读懂WebRTC的SDP、RTP包和关键帧请求,必须掌握以下术语。
- GOP(Group of Pictures):一组从I帧开始、到下一个I帧之前的图像序列。GOP越长,压缩率越高,但随机接入和抗丢包能力越弱。WebRTC通常使用较短的GOP,并配合PLI/FIR请求关键帧。
- I帧(Intra Frame):帧内编码帧,不依赖其他帧,可独立解码,是随机接入点。I帧体积大,是带宽波动的常见来源。
- P帧(Predicted Frame):前向预测帧,只参考前面的帧,压缩率较高,延迟较低,是实时通信中最常用的帧类型。
- B帧(Bi-directional Frame):双向预测帧,同时参考前后帧,压缩率最高,但需要缓存未来帧,增加编码和解码延迟。WebRTC默认通常禁用B帧。
- SPS(Sequence Parameter Set):序列参数集,描述分辨率、帧率、位深、色彩格式等序列级信息。
- PPS(Picture Parameter Set):图像参数集,描述熵编码模式、量化参数、切片组等图像级信息。
- VPS(Video Parameter Set):H265新增的视频参数集,描述多层、时域子层等整体信息,位于SPS之上。
在H264中,参数集只有SPS和PPS;在H265中,参数集扩展为VPS、SPS、PPS三层。WebRTC的RTP载荷中,参数集通常通过SDP的sprop-parameter-sets或带内NAL单元传输。若参数集丢失,解码器无法初始化,表现为黑屏或花屏。
三、压缩效率对比:为什么H265更省带宽
H265的压缩增益来自多个方面:更大的编码单元(CTU最大64×64)能更好匹配平坦区域;四叉树划分让编码器在纹理复杂区域使用小块、在平坦区域使用大块;35种帧内预测方向比H264的9种更精细;变换尺寸从4×4到32×32自适应;此外还有样本自适应偏移(SAO)等环路滤波工具。综合下来,在相同主观质量下,H265通常比H264节省30%~50%码率。但在WebRTC中,H265的收益会被实时性、硬件支持和专利成本部分抵消。
| 对比维度 | H264 / AVC | H265 / HEVC |
|---|---|---|
| 编码单元 | 宏块 16×16 | CTU 最大 64×64,四叉树划分 |
| 帧内预测方向 | 9 种 | 35 种 |
| 变换尺寸 | 4×4、8×8 | 4×4 ~ 32×32 |
| 参数集 | SPS、PPS | VPS、SPS、PPS |
| 压缩效率 | 基准 1× | 约 1.3~1.5× |
| 计算复杂度 | 较低 | 较高,约 2~4 倍 |
| WebRTC 支持 | 广泛,浏览器与硬件成熟 | 逐步增强,依赖平台与硬件 |
四、案例与场景:WebRTC中的GOP与关键帧请求
假设一个1对1通话,发送端使用H264,GOP设置为60帧,帧率30fps,即每2秒一个I帧。当网络抖动导致P帧丢失时,接收端解码器会出现花屏。此时接收端通过RTCP发送PLI(Picture Loss Indication),请求发送端立即产生一个I帧。发送端收到PLI后,强制编码一个I帧,接收端恢复画面。若GOP过长,恢复等待时间变长;若GOP过短,I帧频繁导致码率升高。WebRTC通常建议GOP在1~3秒之间,并结合关键帧请求动态调整。
// WebRTC 中关键帧请求的典型 RTCP 反馈
PLI: Picture Loss Indication
FIR: Full Intra Request
// 发送端收到后,编码器强制输出 IDR 帧
// H264: IDR 帧携带 SPS/PPS 时可独立解码
// H265: IDR 帧通常需要 VPS/SPS/PPS 才能初始化解码器
实操提示:在WebRTC中,H264的SPS/PPS通常通过SDP的sprop-parameter-sets携带,也可在RTP中带内发送;H265的VPS/SPS/PPS则更依赖带内传输或SDP扩展。若参数集丢失,解码器会持续报错,表现为黑屏而非花屏。
五、常见误区与复盘
- 误区一:H265一定比H264好。在低延迟、低功耗的移动端,H265编码复杂度高,可能造成发热、掉帧,反而影响体验。
- 误区二:B帧越多压缩率越高。WebRTC强调实时性,B帧会引入额外缓存和延迟,通常应禁用或严格限制。
- 误区三:参数集不重要。SPS/PPS/VPS是解码器初始化的前提,丢失后无法解码,必须通过SDP或带内可靠传输保障。
- 误区四:GOP越长越好。GOP过长会降低抗丢包能力,关键帧请求频繁又会推高码率,需要根据网络状况动态平衡。
复盘结论:在WebRTC中选H264还是H265,不能只看压缩效率,还要综合浏览器兼容性、硬件编解码能力、专利成本、延迟要求和网络抗丢包策略。理解GOP、I/P/B帧、SPS/PPS/VPS这些基础概念,是后续做编码协商、码率控制和排障的前提。