【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

news2024/9/30 15:20:35

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

【1】FlexFec 的保护方案

假设存在一组源数据包(D × L),其序列号从 1 开始运行到 D × L

  • 一维非交错行 FEC(1-D Non-interleaved Row FEC) : 一种连续的源数据包进行保护的方案,可用于恢复按行分组的源数据包中一个丢失的数据包
    • 每 L 个连续的源数据包通过 "异或" 计算生成一个修复数据包,最终可生成 D 个修复数据包  

 

  • 一维交错列 FEC(1-D Interleaved Column FEC) : 一种对交错的源数据包进行操作的保护方案,可用于恢复按列分组的源数据包中一个丢失的数据包
    • 对序列号间隔 L 的一组源数据包进行 "异或" 计算生成一个修复数据包,最终可生成 L 个修复数据包

 

  • 二维 FEC(2-D FEC) : 融合行和列的保护方案
    • 同时对 D × L 个源数据包进行上述两种操作以生成对应的修复数据包

说明 : 在对应分组的源数据包中仅存在一个数据包丢失时,可以对丢失的数据包进行恢复处理,换言之若对应分组的源数据包的丢包数量大于 1 则恢复处理会失败

【2】FlexFec 保护失败的场景

  • 一维非交错行 FEC(1-D Non-interleaved Row FEC)

在同一行的分组的源数据包中出现两个以上的丢包则恢复失败

  • 一维交错列 FEC(1-D Interleaved Column FEC)

在同一列分组的源数据包中出现两个以上的丢包则恢复失败

  • 二维 FEC(2-D FEC)

至少存在两个按行分组的源数据包/FEC数据包丢包两个以上,并且丢失的数据包在列维度上是对齐的,则恢复失败

至少存在两个按列分组的源数据包/FEC数据包丢包两个以上,并且丢失的数据包在行维度上是对齐的,则恢复失败

【3】FlexFec 数据包格式

【3.1】FlexFec 数据包 -- 整体构成

FlexFec 数据包的整体构成如下图,包含 RTP 数据包头 + RTP 数据包载荷(FEC 数据包头 + 修复载荷)

【3.2】FlexFec 数据包 -- FEC 数据包头

  • R,F : 用于决定 FlexFec 数据包头的格式
  • Padding(P) bit : 表示数据包是否包含可选的填充字节
  • Extension(X) bit : 表述数据包是否包含头部扩展
  • CSRC Count(CC) 4 bit : CSRC 列表中元素个数
  • Marker(M) bit : 标志位,对当前载荷无效,发送者应设置为 0,接收者可以忽视
  • PT recovery : 载荷类型

【3.2.1】弹性 FEC 掩码标识源数据包 -- R = 0,F = 0

  • length recovery (16 bits) : 恢复数据包的长度,该长度包括除了固定 12 字节的 RTP 头之外的长度
  • TS recovery (32 bits) : 恢复数据包时间戳
  • CSRC_i (32 bits) [包含于 RTP 头中] : 描述该 FEC 数据包保护的源数据包的 SSRC 信息,若该 FEC 数据包保护多个 SSRC,则将会存在多个 SN base 以及 Mask
  • SN base_i (16 bits) : 由该 FEC 数据包保护的对应 SSRC 的一系列源数据包的最小序列号
  • Mask : 掩码,标识由该 FEC 保护的数据包,若第 j 位置 1 表示保护序列号为 SN base_i + j 的源数据包
  • k : 若 k = 1 表示后面跟随其他掩码,k = 0 表示最后一个掩码
  • Repair Payload : 根据固定 12 字节的 RTP 头之后的数据计算得到

【3.2.2】固定 FEC 行/列(L/D)标识源数据包 -- R = 0,F = 1

  • length recovery (16 bits) : 恢复数据包的长度,该长度包括除了固定 12 字节的 RTP 头之外的长度
  • TS recovery (32 bits) : 恢复数据包时间戳
  • CSRC_i (32 bits) [包含于 RTP 头中] : 描述该 FEC 数据包保护的源数据包的 SSRC 信息,若该 FEC 数据包保护多个 SSRC,则将会存在多个 SN base 以及 Mask
  • SN base_i (16 bits) : 由该 FEC 数据包保护的对应 SSRC 的一系列源数据包的最小序列号
  • L/D 取值说明
    • L = 0,D = 0 : 保留
    • L > 0,D = 0 : 行 FEC 不跟随列 FEC (1D)
      • 每行保护的源数据包 SN,SN + 1,...,SN + (L - 1)
    • L > 0,D = 1 : 行 FEC 跟随列 FEC (2D)
      • 每行保护的源数据包 SN,SN + 1,...,SN + (L - 1)
      • 每列保护的源数据包 SN,SN + L,...,SN + (D - 1) * L
    • 当行 FEC 数据包发送完毕再发送列 FEC 数据包
      • L > 0,D > 1 : 列 FEC 数据包重复 D 次
      • 每列保护的源数据包 SN,SN + L,...,SN + (D - 1) * L

 注意 : 上图中的描述有些不太理解,D=1时应该不会存在按列保护的源数据包吧

【4】FlexFec 的 SDP 协商

【4.1】SDP 信令交互基本要求

  • 决定是否发送一个/多个 RTP 流
  • 决定是否发送一个/多个修复 RTP 流
  • 明确源流与修复流 SSRC 的关联关系
  • 明确 SSRC 与源流的关系
  • 明确修复数据包与源流的关系
  • 确保使用纠错包恢复特定 SSRC 相关的源数据

【4.2】SDP 交互示例

下图为 FlexFec SDP 交互的示例

表明存在一个视频流(ssrc:1234)以及一个 FlexFec 流(ssrc:2345),源流与修复流通过不同的 ssrc 复用,修复窗口设置为 200ms

【5】FlexFec 保护与恢复流程概述

【5.1】构造修复数据包一般流程概述

  • FEC 位串的生成过程
    • 对由该特定纠错包保护的一系列独立的源数据包的位串进行异或计算,获得对应的 FEC 包头以及有效载荷信息
    • 对生成的 FEC 包头以及有效载荷信息的位串进行奇偶校验

  • 每个源数据包的位串的组成结构
    • 16 bit : RTP 数据包头的前 16 bit
    • 16 bit : 无符号网络字节序,描述源数据包长度 - 12 字节(RTP 数据包头的固定长度)
    • 32 bit : 描述 RTP 数据包头的时间戳
    • 其他 : 固定 12 字节 RTP 数据包头之后的所有字节

  • 根据 FEC 位串生成 FEC 数据包头以及载荷的过程
    • FEC Header 2 bit : 根据格式选择适当的 R/F 的值,FEC 位串 2 bit 跳过
    • FEC Header P recovery field : FEC 位串 1 bit
    • FEC Header X recovery field : FEC 位串 1 bit
    • FEC Header CC recovery field : FEC 位串 4 bit
    • FEC Header M recovery field : FEC 位串 1 bit
    • FEC Header PT recovery field : FEC 位串 7 bit
    • FEC Header length recovery field : FEC 位串 16 bit
    • FEC Header TS recovery field : FEC 位串 32 bit
    • FEC Header SN base_i field : 由当前 FEC 数据包保护的对应 SSRC 的一系列源数据包中的最小序列号
    • FEC Header Mask 或者 L/D field : 根据 FEC 头部相关配置变量以及 FEC 与对应 SSRC 的源数据包保护关系设置
    • FEC 载荷 : FEC 位串剩余部分(包含源数据包除了 12 字节固定 RTP 数据包头的数据)

注意 : 若源数据包系列中的数据包长度不等,则短的数据包通过在末尾填充字节 0 的方式与最长的数据包补齐

【5.2】重构源数据包一般流程概述

  • 关联源数据包与纠错数据包一般流程概述
    • 使用掩码关联
      • 1. FEC 数据包头部前两个 bit 必须为 R = 0,F = 0
      • 2. 若掩码中第 i 个 bit 位为 1 则表示序列号为 N + i 的源数据包被该 FEC 纠错数据包保护,其中 N 为基准序列号(标识在 FEC 头部对应字段中)
    • 使用 L/D
      • 1. FEC 数据包头部前两个 bit 必须为 R = 0,F = 1
      • 2. 给定 FEC 纠错包 P* 其对应的源数据包判定方式如下(SN 基准的序列号)
        • 若 D <= 1 则源数据包对应行,SN,SN + 1,...,SN + (L - 1)
        • 若 D > 1 则源数据包对应列,SN,SN + L,...,SN + (D - 1) * L

  • 恢复 RTP 头部
    • 给定集合 T 则恢复其中丢失的数据包头部(数据包序列号为 SEQNUM) 一般过程概述
      • 1. 给定集合 T 中所有收到的每个源数据包生成 80 bit 的位串(RTP 数据包头 : 64 bit + lengthMinus12 : 16 bit 无符号网络字节序),记为 RTP_Head_Bit_String_i
      • 2. 给定集合 T 中的纠错数据包取其 FEC 数据包头的前 80 bit,记为 FEC_Head_Bit_String
      • 3. 计算恢复的位串,Recovery_Head_Bit_String (针对 RTP_Head_Bit_String_i 以及 FEC_Head_Bit_String 进行异或计算)
      • 4. 创建新的数据包 RTP_Recovery 包含 12 字节 RTP 数据包头,不含载荷
      • 5. RTP_Recovery 2 bit : 设置为 2,Recovery_Head_Bit_String 2 bit 跳过
      • 6. RTP_Recovery P : Recovery_Head_Bit_String 1 bit
      • 7. RTP_Recovery X : Recovery_Head_Bit_String 1 bit
      • 8. RTP_Recovery CC : Recovery_Head_Bit_String 4 bit
      • 9. RTP_Recovery M : Recovery_Head_Bit_String 1 bit
      • 10. RTP_Recovery PT : Recovery_Head_Bit_String 7 
      • 11. RTP_Recovery SN : SEQNUM
      • 12. Y : Recovery_Head_Bit_String 16 bit,转换为主机字节序,标识 RTP_Recovery 的长度 - 12
      • 13. RTP_Recovery TS : Recovery_Head_Bit_String 32 bit
      • 14. RTP_Recovery SSRC : 丢失的 RTP 数据包的 SSRC

说明 : 标红部分的文字说明有些不清楚,结合 webrtc 源码分析总结如下

  • 1. 给定集合 T 中的纠错数据包取其 FEC 数据包头部前 96 bit (RTP 数据包头固定长度 12 字节) 为 FEC_Head_Bit_String
    • 其中
      • FEC_Head_Bit_String(bit16 : bit31) 为 FEC Header length recovery field,该数据段之后需要被 SEQNUM 覆盖
      • FEC_Head_Bit_String(bit64 : bit95) 该数据段之后需要被 SSRC 覆盖
  • 2. 给定集合 T 中所有收到的每个源数据包,RTP_Head_Bit_String_i 为 RTP 数据包头(64 bit),lengthMinus12_i 为每个源数据包大小 - 12
  • 3. FEC_Head_Bit_String(bit0 : bit15) 与 RTP_Head_Bit_String_i(bit0 : bit15) 做异或运算以恢复前 16 个 bit
  • 4. FEC_Head_Bit_String(bit16 : bit31) 与 lengthMinus12_i 做异或运算以恢复丢失数据包的大小(减去 12 个字节),记为 Y
  • 5. FEC_Head_Bit_String(bit32 : bit63) 与 RTP_Head_Bit_String_i(bit32 : bit63) 做异或运算以恢复时间戳

  • 恢复 RTP 载荷(此处载荷标识除了 RTP 数据包头 12 字节之后的所有数据)
    • 给定集合 T 则恢复其中丢失的数据包头部(数据包序列号为 SEQNUM) 一般过程概述
      • 1. 分配 Y 字节大小的空间
      • 2. 给定集合 T 中所有收到的每个源数据包,从第 13 字节开始,长度为 Y,组成位串 RTP_PayLoad_Bit_String_i
      • 注意 : 若根据源数据包生成的位串长度小于 Y 则通过在末尾补充 0 的方式将长度补充到 Y
      • 3. 给定集合 T 中纠错数据包,获取 FEC 数据包头之后,长度为 Y,组成位串 FEC_PayLoad_Bit_String
      • 4. 计算恢复的位串,Recovery_PayLoad_Bit_String (针对 RTP_PayLoad_Bit_String_i 以及 FEC_PayLoad_Bit_String 进行异或计算)
      • 5. 将 Recovery_PayLoad_Bit_String 设置到 RTP_Recovery 中

  • 针对二维 FEC 保护的迭代解码算法
    • 一般过程概述
      • 1. num_recovered_until_this_iteration = 0
      • 2. num_recovered_so_far = 0
      • 3. 尽可能根据非交错 FEC 恢复丢失的数据包并记录 num_recovered_so_far = 当前已经恢复的数据包
      • 4. 尽可能根据交错 FEC 恢复丢失的数据包并记录 num_recovered_so_far = 当前已经恢复的数据包
      • 5. 若 num_recovered_so_far > num_recovered_until_this_iteration 则 num_recovered_until_this_iteration = num_recovered_so_far,执行步骤 3 否则执行完毕

参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】RFC8627

【2】webrtc QOS方法二.3(flexfec rfc8627简介) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Pycharm开发Flask框架设置debug模式、port 端口和 host 主机无效的解决办法

方法二 &#xff08;推荐&#xff09; Name 的选择请自行填写&#xff0c;随意。 这里笔者就默认 app 注意事项 需要以这个作为启动项&#xff0c;而不是原来的 flask 启动配置文件。 参考链接 1. 用Pycharm开发Flask框架设置debug模式没有效果的解决办法 2. flask中的de…

项目管理流程文件,招标支撑文件,项目研发,验收等系列支撑文件

写在前面&#xff1a; 我花了一些时间整理了这些年从事软件行业以来的文档&#xff0c;将它们分类整理后&#xff0c;电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档&#xff0c;包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手…

盘点3款超好用的免费录屏软件,快来看!

在现代数字化社会中&#xff0c;录屏软件成为了各行各业中必备的工具之一&#xff0c;用于记录操作步骤、制作教程、分享游戏精彩瞬间等。而寻找一款免费的、功能强大的录屏软件也变得越来越重要。本文将为您介绍3款免费录屏软件&#xff0c;并详细说明使用步骤&#xff0c;帮助…

C语言是否快被时代所淘汰?

今日话题&#xff0c;C语言是否快被时代所淘汰&#xff1f;在移动互联网的冲击下&#xff0c;windows做的人越来越少&#xff0c;WP阵营没人做&#xff0c;后台简单的php&#xff0c;复杂的大数据处理的java&#xff0c;要求性能的c。主流一二线公司基本上没多少用C#的了。其实…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …

pikachu——一、暴力破解模块通关教程

pikachu 一、靶场介绍二、Burte Force&#xff08;暴力破解&#xff09;概述三、基于表单的暴力破解四、验证码绕过&#xff08;on client&#xff09;五、验证码绕过&#xff08;on server&#xff09;六、token防爆破&#xff1f; 一、靶场介绍 靶场搭建&#xff1a; https:…

OpenShift 4 - 在 OpenShift Virtualization 上自动部署 OpenShift 托管集群(演示视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 OpenShift Virtualization 4.12 ACM 2.8 的环境中验证 文章目录 技术架构安装配置环境环境要求安装配置 OpenShift Virtualization安装配置 Red Hat ACM安装配置 MetalLB在 OpenShift …

无涯教程-JavaScript - DEC2HEX函数

描述 DEC2HEX函数将十进制数转换为十六进制。 语法 DEC2HEX (number, [places])争论 Argument描述Required/Optionalnumber 要转换的十进制整数。 如果number为负数,则将忽略位数,并且DEC2HEX返回10个字符(40位)的十六进制数字,其中最高有效位是符号位。其余的39位是幅度位…

24.绳子切割

目录 题目 Description Input Output 思路 注意事项 C完整代码 题目 Description 有N条绳子&#xff0c;它们的长度分别为Li&#xff0c;Li都是正整数。如果从它们中切割出K条长度相同的绳子&#xff08;绳子的长度为整数&#xff09;&#xff0c;这K条绳子每条最长能有…

照片怎么进行压缩?这几个压缩方法分享给你

照片怎么进行压缩&#xff1f;在如今这个时代&#xff0c;我们经常需要共享照片。但是&#xff0c;一些高像素的照片可能会占用大量存储空间&#xff0c;甚至可能无法通过电子邮件或社交媒体进行共享。因此&#xff0c;我们需要对照片进行压缩&#xff0c;以减小文件的大小并方…

互联网医院App开发:构建医疗服务的技术指南

互联网医院App的开发是一个复杂而具有挑战性的任务&#xff0c;但它也是一个充满潜力的领域&#xff0c;可以为患者和医疗专业人员提供更便捷的医疗服务。本文将引导您通过一些常见的技术步骤来构建一个简单的互联网医院App原型&#xff0c;以了解该过程的基本概念。 技术栈选…

A133P EC200M模块调试

Linux USB驱动框架&#xff1a; USB 是一种分层总线结构。USB 设备与主机之间的数据传输由 USB 控制器控制。Linux USB 驱动程序架构如下图所示。Linux USB 主机驱动包括三部分&#xff1a;USB 主机控制器驱动、USB 核心和 USB 设备驱动。 模块加载 USB 转串口 option 驱动程序…

教师节限定!10场数据科学校内赛与10场数据科学数据科学教学实训工作坊,充实实践教学

9月的第一天&#xff0c;上海的南北高架从早上6点开始堵了两个多小时&#xff0c;因为小区附近有个小学差点连门都出不去。那一刻才如此清晰地感受到&#xff0c;开学了。 事实上暑假的两个月&#xff0c;和鲸的员工们几乎没有感受到“假期”和“学期”之间的区别&#xff0c;…

都在说GPT,如何学习并掌握GPT1-4模型运用

了解更多点击《都在说GPT&#xff0c;如何学习并掌握GPT1-4模型运用》 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATL…

Java低代码开发:jvs-list(列表引擎)功能(二)字段及样式配置

字段的增减 进入列表页设计器-页表设计界面&#xff0c;点击新增一行、或者删除按钮&#xff0c;可以对字段进行增减操作&#xff0c;如果对于权限的列表页&#xff0c;可以使用批量创建字段的按钮&#xff1a; 字段的批量设置&#xff0c;点击批量添加如下图所示 字段为中文名…

Linux 进程管理之内核栈和struct pt_regs

文章目录 前言一、内核栈二、struct pt_regs2.1 简介2.2 获取pt_regs 参考资料 前言 Linux内核栈是用于存储内核执行期间的函数调用和临时数据的一块内存区域。每个运行的进程都有自己的内核栈&#xff0c;用于处理中断、异常、系统调用以及内核函数的执行。 每个进程的内核栈…

网络技术十三:DNS(域名服务器)

DNS 域名 产生背景 通过IP地址访问目标主机&#xff0c;不便于记忆 通过容易记忆的域名来标识主机位置 域名的树形层次化结构 根域 领级域 主机所处的国家/区域&#xff0c;注册人的性质 二级域 注册人自行创建的名称 主机名 区域内部的主机的名称 由注册人自行创建…

2023-python-import耗时是为什么?

场景 场景&#xff1a; 树莓派4B 离线安装【arch64架构】 了 torch,sklearn等机器学习库 运行程序文件时候&#xff0c; import的时间总共花了 10s&#xff0c;无法忍受。 查阅下网站&#xff1a; import官方说辞 看蒙了&#xff0c;太多了&#xff1b; 反正就看看大概&…

Credo(纳斯达克股票代码:CRDO)推出Seagull 452系列高性能光DSP芯片

加州圣何塞和中国深圳&#xff0c;2023年9月5日——Credo Technology&#xff08;纳斯达克股票代码&#xff1a;CRDO&#xff09;是一家提供安全、高速连接解决方案的创新企业。Credo致力于为数据基础设施市场提供其所必须的高能效、高速率解决方案&#xff0c;以满足其不断增长…

怎么让图片动起来?试试这几种方法

怎么让图片动起来&#xff1f;让图片动起来可以为你的内容增添趣味性和互动性&#xff0c;吸引更多的关注和互动。在社交媒体上使用动态图片可以吸引更多的关注和互动&#xff0c;让你的内容更容易被人们发现和分享。在广告宣传方面&#xff0c;动态图片可以帮助你更好地展示产…