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单元传输。若参数集丢失,解码器无法初始化,表现为黑屏或花屏。

H264 与 H265 编码结构及参数集对比 H264 / AVC 编码结构 宏块 Macroblock 16×16 子宏块 16×8 / 8×16 / 8×8 / 4×4 预测与变换 帧内预测 9 种方向 变换 4×4 / 8×8 参数集 SPS PPS 压缩效率基准:1× 典型码率:720p@30 ≈ 1.5~2.5 Mbps H265 / HEVC 编码结构 编码树单元 CTU 最大 64×64 四叉树递归划分 CU / PU / TU 预测与变换 帧内预测 35 种方向 变换 4×4 ~ 32×32 参数集 VPS SPS PPS 压缩效率:约 1.3~1.5× 典型码率:720p@30 ≈ 0.8~1.5 Mbps 演进

三、压缩效率对比:为什么H265更省带宽

H265的压缩增益来自多个方面:更大的编码单元(CTU最大64×64)能更好匹配平坦区域;四叉树划分让编码器在纹理复杂区域使用小块、在平坦区域使用大块;35种帧内预测方向比H264的9种更精细;变换尺寸从4×4到32×32自适应;此外还有样本自适应偏移(SAO)等环路滤波工具。综合下来,在相同主观质量下,H265通常比H264节省30%~50%码率。但在WebRTC中,H265的收益会被实时性、硬件支持和专利成本部分抵消。

对比维度H264 / AVCH265 / HEVC
编码单元宏块 16×16CTU 最大 64×64,四叉树划分
帧内预测方向9 种35 种
变换尺寸4×4、8×84×4 ~ 32×32
参数集SPS、PPSVPS、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这些基础概念,是后续做编码协商、码率控制和排障的前提。