Webrtc fec 废除_webtec

Webrtc fec 废除_webtecwebrtcfec

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

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

在基于IP网络的多媒体通信系统(比如WebRTC)中,网络丢包对多媒体通信质量有非常严重的影响:例如造成视频的马赛克、图像模糊、帧率下降等问题,造成音频的声音失真、噪声干扰、音频中断等问题。这都会严重影响系统的通信质量,造成非常差的用户体验。
WebRTC主要采取两种手段对抗网络丢包:丢包重传(NACK)和前向纠错(FEC)。FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错检测,如果发现差错,则利用纠错码进行纠错。而ULPFEC(Uneven Level Protection FEC,直译为非均等保护前向纠错)则是WebRTC实现的FEC方案之一,[本文深入学习ULPFEC的理论基础和实现细节](http://www.jianshu.com/p/06a27ebacec7)。

webrtc fec

相关源码在/src/webrtc/modules/rtp_rtcp/source目录下

解fec包

源码实现在 ulpfec_receiver_impl.cc 

demo


//初始化对象
void init() {
    std::unique_ptr<webrtc::UlpfecReceiver> fec_receiver_;

    fec_receiver_.reset(webrtc::UlpfecReceiver::Create(this));
}  

//添加rtp包并解析
void addAndParse(packet) {
    webrtc::RTPHeader hacky_header;
    hacky_header.headerLength = rtp_header->getHeaderLength();
    hacky_header.sequenceNumber = rtp_header->getSeqNumber();
    if (fec_receiver_->AddReceivedRedPacket(hacky_header,(const uint8_t*) packet->data, packet->length, external_ulp_pt_) == 0 {
   fec_receiver_->ProcessReceivedFec(); //会间接调用到callback
    }
}

//callback 
//需要继承类 : public webrtc::RtpData
OnRecoveredPacket(const uint8_t* rtp_packet, size_t rtp_packet_length) {
// 处理rtp包
}

封fec包

支持fec功能时,一般都使用red封装格式。

demo

void init() {

    webrtc::FecProtectionParams key_fec_params_{
  
  1, 60, webrtc::kFecMaskRandom}
    fec_generator_.reset(new webrtc::UlpfecGenerator());
        fec_generator_->SetFecParameters(key_fec_params_);
}

void buildFec(rtp) {
    red_packet = buildRedPacket(rtp);

    //发送red_packet

    fec_generator_->AddRtpPacketAndGenerateFec((const uint8_t *)rtp->data, payload_length, header_length);

uint16_t num_fec_packets = fec_generator_->NumAvailableFecPackets();

    if (num_fec_packets > 0) {
        uint16_t first_fec_sequence_number = AllocateSequenceNumber(num_fec_packets); //fec 包分配序列号, 紧随在原始rtp包之后

        fec_packets = fec_generator_->GetUlpfecPacketsAsRed(external_red_pt_, external_ulp_pt_, first_fec_sequence_number,header_length);
    }
    for (const auto& fec_packet : fec_packets) {
    //直接发送fec包
    }
}

理解

  • Fec采用的是冗余发送机制, 在带宽允许的情况下fec可以起到预期的效果,但对于带宽严重限制的情况下,有可能带来副作用。
  • Fec的原理是通过几个原始包算出fec包,所有包的任意几个包,都可以算出其他包。类似 1+2=3, 3-1=2, 3-2=1
  • Fec基于以上算法原理,在启用Fec时,可以发送原始包+Fec包,也可以全部发送Fec包,只要通过逆向算法求出原始包即可
  • Fec包的时间戳与原始包一致,序列号紧随原始包之后
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • vs2010旗舰版密钥「建议收藏」

    vs2010旗舰版密钥「建议收藏」YCFHQ-9DWCY-DKV88-T2TMH-G7BHP企业版、旗舰版都适用vs2010旗舰版密钥

    2022年6月6日
    194
  • ue4在c盘的缓存_怎么清除ps在C盘的缓存

    ue4在c盘的缓存_怎么清除ps在C盘的缓存大家好,可能很多新手使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故。下面来告诉大家怎么解决这个问题。概述一、出现的问题:UE4的缓存文件会导致C盘膨胀!二、解决的方式:请严格按照下列步骤来执行1.更改UE4的缓存路径2.删除UE4在C盘的缓存3.删除各个引擎版本SwarmAgent(联机构建)的缓存文件…

    2022年10月5日
    5
  • NOIP2012 疫情控制[通俗易懂]

    NOIP2012 疫情控制[通俗易懂]也许更好的阅读体验Description\mathcal{Description}Description原题链接一句话题意一个人可以堵住一个子树,不能一次堵住整棵树,求堵住每个通往叶子节点的路径,走的最远的那个人走的路程最少是多少,若不能堵住输出−1-1−1Solution\mathcal{Solution}Solution看了下其他题解,都说很毒瘤最开始我也认为很毒瘤就是在决…

    2022年8月22日
    7
  • webService接口服务端与客户端开发(入门级亲测可用)

    webService接口服务端与客户端开发(入门级亲测可用)webService接口服务端与客户端开发网上的有关webService的入门例子很多,但总是让新手云里雾里。看了本篇,如果对您有帮助,请随手一赞。。。经过尝试,发现以下内容:第一:webService服务端开发首先上图,一清二楚、以下weather包中有三种发布服务的方式;如果创建的是Java项目,Server类右键Java运行即可发布,但只能自己访问;如果想让别…

    2022年7月12日
    27
  • plsqldev连接oracle 弹出一个小窗口没有登录[通俗易懂]

    plsqldev连接oracle 弹出一个小窗口没有登录[通俗易懂]昨天已经顺利安装完oracle和PLSQL,今天打开电脑用PLSQL登录时,却发现怎么也登录不进去,上网找了好多办法解答办法原来是:用管理员身份运行一下结果好了!

    2022年4月25日
    208
  • 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

    冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]第3章3.6原题:试解释为什么离散直方图均衡技术一般不能得到平坦的直方图?答:假设有一副图像,共有像素个数为n=MN(M行N列),像素灰度值取值范围为(0~255),那么该图像的灰度值的个数为L

    2022年8月2日
    11

发表回复

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

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