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

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

相关文章

配置远程访问:让外部网络用户能够使用公司内部的OA办公系统

文章目录 前言1. 确认在内网下能够使用IP端口号登录OA办公系统2. 安装cpolar内网穿透3. 创建隧道映射内网OA系统服务端口4. 实现外网访问公司内网OA系统总结 前言 现在大部分公司都会在公司内网搭建使用自己的办公管理系统&#xff0c;如OA、ERP、金蝶等&#xff0c;员工只需要…

SpringBoot 基于 MongoTemplate 的工具类

一、 什么是MongoDB MongoDB基于分布式文件存储的数据库。由C语言编写。MongoDB是一个高性能&#xff0c;开源&#xff0c;无模式的文档型数据库&#xff0c;是当前NoSql数据库中比较热门的一种。 他支持的数据结构非常松散&#xff0c;是类似json的bjson格式&#xff0c;因此…

S/4 FI之FBL3N/FBL3H/FAGLL03/FAGLL03H的区别

SAP 系统中&#xff0c;为了显示财务凭证行项目&#xff0c;由于不同的时间开发的功能&#xff0c;但实际在使用的过程&#xff0c;到底有些什么样区别&#xff1f; 本文档就是想对这一个问题做一个整体上的说明。 FBL3N&#xff0c;就是传统的行项目报表&#xff0c;在最早的…

vue3之pinia简单使用

一、 Pinia介绍 pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档&#xff0c;Pinia是2019年由vue.js官方成员重新设计的新一代状态管理器&#xff0c;更替Vuex4成为Vuex5。 Pinia 目前也已经是 vue 官方正式…

9.4 数据库 TCP

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库if(!db.contains("Stu.db")){//不存在数据库&#xff0…

IOMesh 为 KubeVirt 提供高效稳定的持久化存储支持(附用户实践)

7 月 11 日&#xff0c;KubeVirt 社区正式宣布发布 Kubernetes 原生虚拟机管理插件 KubeVirt v1.0。这一版本发布不仅标志着 KubeVirt 已进化为生产就绪的虚拟机管理解决方案&#xff0c;也为正在使用虚拟化环境的用户提供了更多元的云化转型路线&#xff1a;搭配 Kubernetes 持…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

JavaWeb开发中的问题

一&#xff0c;页面没有显示css样式效果 在修改jsp文件时&#xff0c;浏览器呈现效果能发生改变&#xff0c;但修改css样式文件却没有效果&#xff0c;得清除浏览数据&#xff0c;重新运行&#xff0c;css样式才能有效果。以上所得&#xff1a;css文件应该会保存在浏览记录中。…

java导出Mysql表信息生成Word文档

一、背景描述 系统上线或者交付&#xff0c;或者需要提供整理数据库表信息&#xff0c;如果一个个整理未免麻烦&#xff0c;接下来一个demo示例如何用JAVA导出Mysql数据库表信息生成Word文档。 传入null导出全部表 传指定表只导出指定表

使用Process Explorer查看线程的函数调用堆栈去排查程序高CPU占用问题

目录 1、问题描述 2、使用Process Explorer排查软件高CPU占用的一般思路 3、使用Process Explorer工具进行分析 3.1、找到CPU占用高的线程 3.2、查看CPU占用高的线程的函数调用堆栈&#xff0c;找到出问题的代码 3.3、libwebsockets库导出接口lws_service的说明 3.4、解…

通达信指标编写,16进制颜色对照表,妈妈再也不用担心颜色不够用了!!

★★★★★博文创作不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习小技巧&#xff0c;喜欢的老铁可以多多点赞收藏分享置顶&#xff0c;小红牛在此表示感谢。★★★★★ #龙虎榜小红牛系统&#xff0c;官方微信公众号&#xff1a;g…

使用QT操作Excel 表格的常用方法

VBA 简介 Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能&#xff0c;Visual Basic for Applications&#xff08;VBA&#xff09;是一种Visual Basic的一种宏语言。 在VBA的参考手册中就可以看到具体函数、属性的用法&#xff0c;Qt操作Excel主要通过 QAxObj…