视频抖动缓冲与组帧 · 把破碎的包流重建成帧
收到的包乱序、有缺、时快时慢,得先缓冲、排序、拼成完整帧,才能解码。这一章读 video/frame_buffer.h:抖动缓冲怎么吸收网络抖动、组帧怎么等齐一帧的所有包,以及「缓冲大小」在流畅和延迟之间的根本权衡。
作者 David更新于 第 59 篇(共 112 篇)
视频抖动缓冲与组帧 · 把破碎的包流重建成帧
接收侧的第一场硬仗。网络交给你的,是一串乱序、有缺口、时快时慢的 RTP 包——绝不能直接喂解码器。得先缓冲、排序、拼成完整的帧,还要平滑掉网络的抖动。这是抖动缓冲(jitter buffer)+ 组帧的活,video/frame_buffer.h 的 FrameBuffer 是核心。
网络抖动:包到得忽快忽慢
先看要对抗什么。发送端明明是匀速发的(每帧间隔均匀),但经过网络,包的到达时间变得参差不齐——这就是抖动(jitter):
如果收到就立即解码播放,画面就会忽快忽慢地抽搐。抖动缓冲的使命,就是把参差的到达,重新变回匀速的播放。
组帧:等齐一帧的所有包
抖动缓冲干两件交织的事。第一件是组帧:
抖动吸收:攒一点再放
第二件事是吸收抖动:
根本权衡:流畅 vs 延迟
抖动缓冲藏着实时媒体一个绕不开的权衡:
小结与下一章
接收侧第一关:抖动缓冲 + 组帧(video/frame_buffer.h)。组帧——按时间戳归拢一帧的多个包,靠序号 + marker判断收齐,等重传补缺。吸收抖动——攒一小段帧再匀速播,把网络参差的到达抹平,缓冲深度动态自适应。核心权衡:缓冲深则流畅但延迟高、浅则低延迟但易卡,按场景取舍。
帧拼齐了,但视频帧之间有参考依赖(帧间预测)——解码前必须理清“这帧依赖哪些帧、能不能解”。下一章看帧引用查找。👉 帧引用查找。
参考资料
- [1] libwebrtc 源码.
video/frame_buffer.h、modules/video_coding/(组帧、抖动估计jitter_estimator.h)。 - [2] libwebrtc 源码.
modules/video_coding/timing/(与 timing 配合)。 - [3] 关联音频 NetEq——同类抖动缓冲问题。