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

【网络通信 -- 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.rhkb.cn/news/124412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LaTeX总结-2023年9月8日

1. LaTeX总结 文章目录 1. LaTeX总结1.1. 定义作者&#xff0c;通讯作者&#xff0c;地址&#xff0c;宏包1.1.1. Example 11.1.2. Example 21.1.3. 特殊符号——作者标注注 1.2. 调整字体1.2.1. 数学模式下使用正体1.2.2. LaTeX内使用中文1.2.3. 正文文字 1.3. 常用符号及字母…

专业游戏翻译公司怎么选择比较合适

近年来&#xff0c;游戏行业持续繁荣&#xff0c;市场需求也在不断扩大&#xff0c;其中游戏翻译的需求越来越旺盛。无论是引进游戏还是让游戏走向国际市场&#xff0c;都需要专业的翻译公司来帮忙。那么&#xff0c;怎么选择合适的游戏翻译公司呢&#xff1f;让我们一起来看看…

大数据技术之Hadoop:HDFS存储原理篇(五)

目录 一、原理介绍 1.1 Block块 1.2 副本机制 二、fsck命令 2.1 设置默认副本数量 2.2 临时设置文件副本大小 2.3 fsck命令检查文件的副本数 2.4 block块大小的配置 三、NameNode元数据 3.1 NameNode作用 3.2 edits文件 3.3 FSImage文件 3.4 元素据合并控制参数 …

论文笔记:一分类及其在大数据中的潜在应用综述

0 概述 论文&#xff1a;A literature review on one‑class classification and its potential applications in big data 发表&#xff1a;Journal of Big Data 在严重不平衡的数据集中&#xff0c;使用传统的二分类或多分类通常会导致对具有大量实例的类的偏见。在这种情况…

小白备战大厂算法笔试(三)——栈、队列、双向队列

文章目录 栈栈常用操作栈的实现基于链表的实现基于数组的实现 两种实现对比栈典型应用 队列队列常用操作队列实现基于链表的实现基于数组的实现 队列典型应用 双向队列双向队列常用操作双向队列实现基于双向链表的实现基于数组的实现 双向队列应用 栈 栈是一种遵循先入后出的逻…

CVE-2017-12149

春秋云镜 CVE-2017-12149 JBoss反序列化漏洞 靶标介绍 2017年8月30日&#xff0c;厂商Redhat发布了一个JBOSSAS 5.x 的反序列化远程代码执行漏洞通告。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中&#xff0c;其doFilter方法在没有进行任何安全检查…

算法通关村第十三关——溢出问题处理模板

前言 溢出问题是面试当中输出涉及到数字的一个需要特别注意的地方&#xff0c;典型的题目有三个&#xff1a;数字反转&#xff0c;将字符串转成数字和回文数。 1.整数反转 力扣7题&#xff0c;给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

多次开关机&#xff0c;发现usb hub和4G都通信失败了&#xff0c;这就有点奇怪了&#xff0c;按理说usb驱动是没啥问题的 先查看usb log rootlinaro-alip:/# dmesg | grep usb [ 1.723797] usbcore: registered new interface driver usbfs [ 1.723828] usbcore: regis…

在很多公司里面会使用打tag的方式保留版本

&#xff1a;git tag|grep "xxx-dev“等分支来查看 2&#xff1a;git cherry-pick XXXXX 然后就是查看有冲突这些 git status 会出现相关的异常 然后解决相关的冲突 git add . git cherry-pick --continue git push XXX HEAD:refs/for/XXX 第一&#xff1a;git ta…

【LeetCode-中等题】17. 电话号码的字母组合

文章目录 题目方法一&#xff1a;递归回溯 题目 方法一&#xff1a;递归回溯 参考讲解&#xff1a;还得用回溯算法&#xff01;| LeetCode&#xff1a;17.电话号码的字母组合 首先可以画出树图&#xff1a; 先将数字对应的字符集合 加入到一个map集合 这里需要一个index来控…

伪静态web.config常见规则写法与参数介绍说明

伪静态web.config常见规则写法与参数介绍说明. 示例1&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"规则 1" stopProcessing"tru…

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…

Go 接口和多态

在讲解具体的接口之前&#xff0c;先看如下问题。 使用面向对象的方式&#xff0c;设计一个加减的计算器 代码如下&#xff1a; package mainimport "fmt"//父类&#xff0c;这是结构体 type Operate struct {num1 intnum2 int }//加法子类&#xff0c;这是结构体…

MySQL——数据库以及数据表的创建

创建数据库 回到刚才创建数据库的问题&#xff0c;我们在创建数据库的时候可以通过添加一个参数&#xff0c;这个参数的意义在于当我们创建的数据库已经存在的时候则不会创建&#xff0c;也不会报错&#xff0c;如果不使用这个参数&#xff0c;则我们在重复创建一个已经存在的…

数据结构--- 树

(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。​ 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…

2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

vue2笔记

Vue笔记 视频: https://www.bilibili.com/video/BV1Zy4y1K7SH?p1 vue是渐进式JavaScript框架 用到什么功能&#xff0c;只需要引入什么功能模块 ; vue的特点:易用,灵活,高效; 组件化 , 一个vue文件包括了(html css js)声明式编程(不直接操作DOM) ;虚拟DOM diff算法(虚拟dom…

C# 基础面试题(万字)

1.选择题 1. 简述下面选项能够捕获运算溢出的异常类型的有 &#xff1f; A)Exception B)SystemException C)ArithmeticException D)OverflowException 试题回答&#xff1a;AD 2. 程序员可使用&#xff08;&#xff09;语句以程序方式引发异常 &#xff1f; A)run B)try C)th…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…

VR农学虚拟仿真情景实训教学演示

首先&#xff0c;VR农学虚拟仿真情景实训教学提供了更为真实的实践环境。传统的农学实训往往受制于时间、空间和资源的限制&#xff0c;学生只能通过观察或简单的模拟来学习农业知识和技能。而借助虚拟现实技术&#xff0c;学生可以进入虚拟农场&#xff0c;与各种农作物、工具…