热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ULPFEC在WebRTC中实现

FEC报文构建、FEC掩码构造和丢失数据包恢复ForwardErrorCorrection::EncodeFec()主要:如2.2.1中所介绍的,随机丢包和突发丢包下fec组包模式

FEC报文构建、FEC掩码构造和丢失数据包恢复

ForwardErrorCorrection::EncodeFec()主要:


  • 如2.2.1中所介绍的,随机丢包和突发丢包下fec组包模式不同,所以webrtc准备了两张mask表 kFecMaskRandom(随机丢包), kFecMaskBursty(突发丢包)去生成mask, 调用internal::GeneratePacketMasks()去生成mask
  • 根据mask和packet, 调用GenerateFecPayloads()生成fec包
  • 调用FinalizeFecHeaders()填入ssrc

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

本节深度分析WebRTC 60 Codebase中ULPFEC的相关代码,总结出其实现算法和细节。
下面以Video为例,从FEC报文构建、FEC掩码构造和丢失数据包恢复三个方面分析ULPFECWebRTC中的实现

3.1 ULPFEC报文构建

WebRTC中ULPFEC报文构建的流程如图8所示:

ForwardErrorCorrection::EncodeFec(media_packets,protection_factor,
num_important_packets, use_unequal_protection, fec_mask_type, fec_packets) {
// step 1, 根据媒体数据包个数和保护因子,确定需要生成的fec数据包个数并初始化。
int num_fec_packets = NumFecPackets(num_media_packets, protection_factor);
for (int i = 0; i memset(generated_fec_packets_[i].data, 0, IP_PACKET_SIZE);
fec_packets->push_back(&generated_fec_packets_[i]);
}
// step2, 构建fec掩码表,并从中获取构造fec包需要的掩码,存储在packet_mask_中。
// 这一步是最关键的,packet_masks_决定媒体数据包在FEC包中受保护的分布情况。
const internal::PacketMaskTable mask_table(fec_mask_type, num_media_packets);
internal::GeneratePacketMasks(num_media_packets, num_fec_packets,
num_important_packets, use_unequal_protection, mask_table, packet_masks_);
// 步骤3,以packet_masks_和packet_mask_size_,media_packets和num_fec_packets
// 为输入,生成FEC包集合generated_fec_packets_,包括半成品的头部和成型的负载。
GenerateFecPayloads(media_packets, num_fec_packets);
// 步骤4,填充并修正生成生成FEC数据包的头部,这很简单,按照RFC填充即可。
FinalizeFecHeaders(num_fec_packets, media_ssrc, seq_num_base);
}

step1: 根据媒体数据包个数和保护因子,确定需要生成的fec数据包个数并初始化。
step2: 构建fec掩码表,并从中获取构造fec包需要的掩码,存储在packet_mask_中。
step3: 以packet_masks_和packet_mask_size_,media_packets和num_fec_packets
      为输入,生成FEC包集合generated_fec_packets_,包括半成品的头部和成型的负载。
step4: 填充并修正生成生成FEC数据包的头部,这很简单,按照RFC填充即可。

FEC构造过程:
1) 根据输入媒体数据包的个数m和保护因子factor,确定需要生成的FEC包的个数num_fec = m * factor / 256.
2) 初始化这num_fecFEC包。
3) 创建掩码表并获取num_fecFEC包所需要的掩码数据,存储packet_masks_。
掩码表是预先定义好的一张三维表格,用以模拟不同情况下媒体数据包FEC包中的保护分布情况,3.2节会针对该问题进一步分析。
4) 函数以掩码信息packet_masks_,媒体数据包media_packets和fec包个数num_fec为输入调用GenerateFecPayloads()函数生成FEC数据包,此时FEC包中的负载部分已经成型,但是FEC头部需要进一步修正
5) 调用FinalizeFecHeaders()解决。

至此,FEC包的构造过程分析完毕。需要注意的是,WebRTC仅仅使用ULPFEC的Level 0对媒体数据包进行保护,也即FEC包中只有一个FEC Level。
另外,WebRTC内部,保护RTP头部的FEC头部称之为Level 0,而保护RTP负载的FEC Level部分称之为Level 1。这里和FEC5109文档中所定义的稍有不同,需要注意一下。

3.2 ULPFEC掩码表和掩码

根据RFC5109中相关定义可知,一个媒体数据包可以由多个FEC包保护,而一个FEC包也可以多保护多个媒体数据包。
假设m个媒体数据包需要n个FEC数据包保护,则可以定义一个二维的m * n零一矩阵来描述媒体数据包fec包中的保护分布情况:矩阵中元素m[i, j]置1表示第i个媒体数据包需要第j个FEC包保护。从行角度讲,第i行元素表示第i个FEC包保护的媒体数据包的集合;
从列角度讲,第j列元素表示保护第j个媒体数据包的FEC包的集合。
由于该矩阵是零一矩阵,因此存储上可以采用掩码来存储。
这个掩码也就是FEC Level Header中所定义的掩码。

那么掩码中的1该如何分布。我们知道,现实世界中网络丢包分为随机丢包和突发丢包两种情况,FEC包需要能够针对这两种情况对媒体数据包进行保护。
WebRTC预先构造两个掩码表kPacketMaskRandomTbl和kPacketMaskBurstyTbl,以模拟随机情况和突发情况下媒体数据包FEC包中的保护分配情况。
假设随机丢包场景下,对于m * n的情况,我们只需要从kPacketMaskRandomTbl[m][n]就可以获取FEC包所需要的全部掩码. 然后该掩码为基础,构造FEC数据包。

根据ULP思想,FEC包可以对媒体数据包集合中的不同数据包实施不同的保护力度。
这源于一帧视频数据编码后生成的一系列RTP数据包中,其重要性是不一样的,比如开始几个RTP包的重要性更大一些.因此,WebRTC构造FEC包的掩码时,有均匀保护和非均匀保护两种策略。

对于均匀保护,所有RTP包的重要性一样,FEC包对他们进行平等的均匀的保护。
对于m * n,FEC包使用的掩码即为kPacketMaskRandomTbl[m][n]。
对于非均匀保护,RTP包集合被非为重要数据包集合S1和普通数据包集合S2,分配较多个FEC包来保护S1,较少个FEC包保护S2。
WebRTC定义了三种模式针对实现非均匀保护:
1)kModeNoOverlay:非叠加保护,保护S1的掩码和S2的掩码相互分离。
2)kModeOverlay:叠加保护,保护S1的掩码和S2的掩码叠加一起。
3)kModeBiasFirstPacket:均匀保护的基础上,所有FEC包都保护第一个包。

假设保护场景为(m,n),其中重要数据包为前k个,分配给重要数据包的FEC包个数为t,掩码表为mask_table.
则三种场景下最终掩码的确定如下:

1)kModeNoOverlay:mask_table[k][t]和mask_table[m-k][n-t]的移位组合。
2)kModeOverlay: mask_table[k][t]和mask_table[m][n-t]的拼接。
3)kModeBiasFirstPacket:mask_table[m][n],再第一列全部置1。

至此,关于ULPFEC的掩码表和掩码分析完毕。


3.3 ULPFEC报文接收和数据包恢复

ULPFEC报文接收和丢失数据包恢复是ULPFEC报文构造和发送的逆过程,该过程分为三个子过程:
1)把接收到的RED包进行解包得到RTP包或FEC包。
2)把RTP/FEC包插入到FEC处理模块的合适列表中。
3)发起数据包恢复尝试。图9描述这个过程。

var cpro_id = "u6885494";

推荐阅读
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
快乐的芙蓉HAPPY
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有