Licode实现webrtc svc(1)

本文深入解析Licode如何实现时域+空域 SVC 的丢包策略,涉及开启丢帧功能、切换流程、丢包处理及信息重写等关键步骤,探讨带宽评估优化与实际操作中的挑战。
摘要由CSDN通过智能技术生成

简介

本篇文章介绍Licode是怎么做时域+空域svc的丢包的,所有的代码都是集中在QualityFilterHandler.cpp中。不包含弱网自动降级的策略,弱网自动降级会在在接下来文章介绍。
时域 svc:可以删掉不同时域层级的帧,最后表现出来的就是帧率不一样。
空域 svc:可以删掉不同空域层级的帧,不同空域的分辨率不一样。空域svc有两种,大小流的空域svc和单流的空域svc。

流程

licode中大概流程如下图。总结就是:判断当前包不属于当前时域或者当前空域我们就把它丢弃。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea686675a0694d3389728063e6cc51d8.png

详细

开启

licode通过detectVideoScalability这个函数判断是否需要开启丢帧的功能。

void QualityFilterHandler::detectVideoScalability(const std::shared_ptr<DataPacket> &packet) {
   
  //如果已经开启了,直接返回
  if (is_scalable_ || packet->type != VIDEO_PACKET) {
   
    return;
  }
  //当这个包rid不等于0
  //时域属于1
  //空域属于1
  if (packet->rid != "0" ||
      packet->belongsToTemporalLayer(1) ||
      packet->belongsToSpatialLayer(1)) {
   
    is_scalable_ = true;
    quality_manager_->enable();
  }
}

从上面代码可以看到,is_scalable_ 是用于标记是否开启该功能。

当有以下情况时is_scalable_会被标记为true:

  1. 收到rid为非0的包,也就是除了rid == 0 的流还有rid != 0的流。这种情况代表了开启了simulcast,可以做空域的svc。

  2. 通过belongsToSpatialLayer判断当前包属于空域1。这种情况包含非simulcast的空域svc,在一些视频编码格式(如vp9)中不需要由大小流做svc,一个视频流中有空域的svc层。

  3. 通过belongsToTemporalLayer判断当前包属于时域1,具有时域的svc。

在上面3种情况下,会开启svc的功能。
并且会调用quality_manager_->enable()这个函数,开启了自动降级的策略,自动降级的策略简要的说:当带宽探测发现当前的带宽不足以发送当前码率视频时,会开启自动降低时域或者空域的码率。

准备切换

在切时域和空域的时候分为准备进行。在checkLayers函数中会去拿quality_manager_的结果,用于判断是否需要准备切换时域或者空域。

void QualityFilterHandler::checkLayers() {
   
  // 从弱网降级模块获取当前最新的空域层级
  int new_spatial_layer = quality_manager_->getSpatialLayer();
  // 当弱网降级模块给的空域层级不是当前的层级 && 没有正在改变层级
  if 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值