webrtc源码分析 渲染延时

本文探讨了视频渲染中如何实现低延时渲染,特别是在启用低延时渲染算法时,最大延时被限制在500毫秒内。通过分析代码,可以看出在非低延时和低延时模式下,公网传输延时分别达到了120毫秒和40毫秒。低延时渲染适用于共享屏幕和反向控制等场景,牺牲平滑性以换取更低的延时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为了平滑渲染,造成延时

FrameBuffer::StartWaitForNextFrameOnQueue()
           |
FrameBuffer::FindNextFrame

在FindNextFrame里面有计算渲染时间

    if (frame->RenderTime() == -1) {
      frame->SetRenderTime(timing_->RenderTimeMs(frame->Timestamp(), now_ms));
    }
int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp,
                                        int64_t now_ms) const {

  constexpr int kLowLatencyRendererMaxPlayoutDelayMs = 500;
  if (min_playout_delay_ms_ == 0 &&
      (max_playout_delay_ms_ == 0 ||
       (low_latency_renderer_enabled_ &&
        max_playout_delay_ms_ <= kLowLatencyRendererMaxPlayoutDelayMs))) {
    // Render as soon as possible or with low-latency renderer algorithm.
    return 0;
  }
  // Note that TimestampExtrapolator::ExtrapolateLocalTime is not a const
  // method; it mutates the object's wraparound state.
  int64_t estimated_complete_time_ms =
      ts_extrapolator_->ExtrapolateLocalTime(frame_timestamp);
  if (estimated_complete_time_ms == -1) {
    estimated_complete_time_ms = now_ms;
  }

  // Make sure the actual delay stays in the range of `min_playout_delay_ms_`
  // and `max_playout_delay_ms_`.
  int actual_delay = std::max(current_delay_ms_, min_playout_delay_ms_);
  actual_delay = std::min(actual_delay, max_playout_delay_ms_);
  return estimated_complete_time_ms + actual_delay;
}

一帧视频的预期渲染时间是发送端发送时间+网络延时时间+解码时间+渲染模块耗时时间
发送端发送时间:可以根据发送报文的时间戳+接收第一帧视频的系统时间推算出来。

  • 但是我们注意到一个条件:
  • (low_latency_renderer_enabled_ &&
    max_playout_delay_ms_ <= kLowLatencyRendererMaxPlayoutDelayMs)
    低延时渲染,并且最大延时设置小于低延时阀。
    我们来对比一下,在非低延时和低延时情况,其他条件相同
    在这里插入图片描述
    经过公网服务器传输,非低延时情况是 120ms 延时
    在这里插入图片描述
    经过公网服务器传输,低延时情况是 40ms 延时

这个低延时的参数这版本还没对上层开放设置,低延迟的场景可以用在共享屏幕,反向控制的场景上,牺牲平滑性换取低延时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值