FEC详解三_第二十三卦详解

FEC详解三_第二十三卦详解继续上文讲解:3)标准的RTP头结构如下所示:其中第一个字节中的x标志位是否扩展了RTP头,RTP协议允许用户自定义的扩展,扩展的字段紧挨上述RTP固定头。RTP扩展投中承载如下信息:1).当前包所在的Group组序号,码流由连续的Group组成,每个Group拥有自己的唯一序号。(仅仅是小范围的唯一,序号大于255时,计数清零)2).当前包所在的Group组大小3

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

继续上文讲解:

3)

标准的RTP头结构如下所示:

FEC详解三_第二十三卦详解

其中第一个字节中的x标志位是否扩展了RTP头,RTP协议允许用户自定义的扩展,扩展的字段紧挨上述RTP固定头。RTP扩展投中承载如下信息:
1).当前包所在的Group组序号,码流由连续的Group组成,每个Group拥有自己的唯一序号。(仅仅是小范围的唯一,序号大于255时,计数清零)
2).当前包所在的Group组大小
3).当前包在Group内的位置
RTP头中的7bit的PT字段标示负载的类型,对于标准类型如音频AAC、视频H264其参考值列出在RFC3551中。RTP负载除了音视频数据外还包冗余包,为此我们指定一个自定义的FEC冗余包类型,这样方便接收端做区分处理。
发送端对一组待发送的应用层数据进行FEC编码并RTP打包发送,其流程如下所示:
FEC详解三_第二十三卦详解FEC详解三_第二十三卦详解
图中P1~P8代表外层传入本模块的原始媒体数据包,r1~r3代表冗余包。本示例中一个Group有8个媒体包外加3个冗余包组成。当模块传入媒体包p时,进行RTP封装后发出,同时存入模块内部队列。当Group的最后一个媒体包P8发送完毕时,对队列中存放的各P1~P8进行FEC编码生成冗余包r1~r3并RTP打包发送。如此循环,直至处理所有输入数据包,Group与Group之间相互独立的,他们的大小包数可以不同,比如前一个Group为(8,3)组合,下一个Group可以为(8,4)组合,我们提供了一种动态冗余度的的模式,支持发送端根据接收端的网络接收情况动态调整冗余度,已达到最佳的服务质量。比如信道条件较差,接收方丢包率上升,发送端可以调高冗余度,以增强抗丢包能力;反之,如果接收方丢包率很低,发送端则可以降低冗余度,以节省网络带宽,所有的这些处理都封装到了本模块中,实现了对用户透明。
接收端进行FEC解码以实现丢包数据的恢复,其处理流程如下所示:
FEC详解三_第二十三卦详解FEC详解三_第二十三卦详解
本例子中P4媒体包在网络传输过程中丢失,下面说明其接收端FEC解码的处理流程。
当接收到该Group的P1、P2、P3包时,因为他们没丢失,可以直接输出给应用层,如此同时在本地对流缓存一份,以供后续可能的FEC解码使用(后续Group内若无丢白,则缓存数据清空)。
当收到P5包时,可以根据Group包序号判断出P4包出现丢失,此时停止本Group数据的输出,P5存入本地队列。
当收到P6。。。继续直至收到r1时,满足了丢包恢复的条件:
收到的媒体包数+收到的冗余包数 >= Group原始媒体包数
对P1、P2、P3、P5、P6、P7、P8、r1进行FEC解码处理,得到P4包数据。因为之前已经输出了P1~P3,此处只需输出P4~P8.
当继续收到冗余包r2、r3时,可以直接丢弃。
如果收到的媒体包数加上冗余包数小于Group原始媒体包数,本Group的丢包无法恢复,系统直接按序输出收到的包。
需要说明:当网络没有丢包时,本模块不会引入延时。当网络出现丢包时,将不得不等到本组FEC恢复完成后再继续输出,因此会引入一定延时,这是FEC的代价之一。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169616.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker网络的配置

    docker网络的配置docker网络的配置Linux内核实现名称空间的创建ipnetns命令可以借助ipnetns命令来完成对NetworkNamespace的各种操作。ipnetns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。注意:ipnetns命令修改网络配置时需要sudo权限。可以通过ipnetns命令完成对NetworkNamespace的相关操作,可以通过ipnetnshelp查看命令帮助信息:[root@localhost~]#ipne

    2022年6月17日
    26
  • pytorch实现resnet_如何搭建平台

    pytorch实现resnet_如何搭建平台ResNet34网络结构先上图参照ResNet18的搭建,由于34层和18层几乎相同,叠加卷积单元数即可,所以没有写注释,具体可以参考我的ResNet18搭建中的注释,ResNet34的训练部分也可以参照。importtorchimporttorch.nnasnnfromtorch.nnimportfunctionalasFclassCommonBlock(nn.Module):def__init__(self,in_channel,out_chann

    2022年10月5日
    3
  • C#中Dock属性的作用[通俗易懂]

    C#中Dock属性的作用[通俗易懂]当在C#项目开发中,在窗体界面的设置经常用到Dock属性值。这里一panel面板的Dock属性值为例描述其作用。当容器中的控件的Dock属性设置为Fill时,可能会覆盖其他Dock属性为Top,Bottom,Right,Left的控件。为了避免出现覆盖现象,可以将被覆盖的控件置于底层就可以(在panel面板上“右键”–“置于底层”),如下图所示。应用Dock时,越是底层的控件,其优先级越高。

    2025年10月28日
    4
  • 每天一个linux命令:top命令[通俗易懂]

    每天一个linux命令:top命令

    2022年2月9日
    46
  • Linux查看硬件信息命令

    Linux查看硬件信息命令一 查看服务器硬件信息 1 查看服务器型号 序列号 root Master dmidecode grep SystemInform A9 egrep nbsp Manufacturer Product Serial nbsp nbsp 2 查看主板型号 root Master dmidecode grep A16 SystemInform nbsp

    2025年11月10日
    2
  • mysql 幂等(什么是幂等性)

    一、什么是幂等?幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。二、使用幂等的场景1、前端重复提交用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的bug。2、接口超时重试对于给第三方调…

    2022年4月10日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号