为何WebRTC中P帧的num_references参数值为1?
WebRTC非关键帧参考帧数量设为1的原因
对应实现代码:
frame->num_references = frame->frame_type() == kVideoFrameKey ? 0 : 1;
这个设计完全是围绕WebRTC的核心定位——实时双向音视频通话做的取舍,和H.264用在点播、单向直播等非实时场景的设计思路完全不同,具体原因如下:
- 缩小丢包影响范围:WebRTC绝大多数场景运行在不稳定的公网环境,丢包是常态。如果参考帧数量大于1,任意一个参考帧丢失,后续所有依赖该帧的非关键帧都会解码失败,出现花屏、卡顿,只能等下一个关键帧到来才能恢复。参考帧设为1时,单帧丢包的影响最多只到下一帧,只要重传丢失的1个帧就能快速恢复,大幅降低丢包带来的故障时长。
- 降低编解码资源开销:参考帧数量越多,编码时需要缓存的历史参考帧越多,解码时也需要在内存中保存对应数量的历史帧,运算复杂度也会同步提升。WebRTC需要兼容手机、嵌入式设备、低性能PC等各类终端,单参考帧设计可以大幅降低弱性能设备的编解码压力,减少内存占用,避免因设备性能不足导致的通话卡顿。
- 适配低延迟要求:实时通话要求端到端延迟控制在几百毫秒以内,多参考帧编码会引入额外的帧缓存延迟,解码端也需要等待更多参考帧就绪才能开始解码。单参考帧设计可以把编解码两端的帧缓存开销降到最低,进一步压缩端到端延迟,符合实时通话的核心需求。
- 配合WebRTC自带的错误恢复机制:WebRTC内置了NACK、PLI、FIR等丢包修复和关键帧请求机制,单参考帧结构下这些机制的触发逻辑更简单,修复效率更高。如果是多参考帧结构,即使收到重传的丢失帧,后续依赖帧可能已经因为超时被丢弃,修复价值极低。
内容的提问来源于stack exchange,提问作者user5777149
相关产品推荐
相关产品推荐

