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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BigDecimal.setScale方法

    BigDecimal.setScale方法BigDecimal.setScale()方法用于格式化小数点BigDecimal.setScale(1)表示保留一位小数,默认用四舍五入方式 BigDecimal.setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如1.11会变成1.1 BigDecimal.setScale(1,BigDecimal.ROUND_UP)进位处理,1.11变成1.2 BigD…

    2022年10月20日
    0
  • INFO: API ‘variant.getJavaCompile()’ is obsolete and has been replaced with ‘variant.getJavaCompileP

    INFO: API ‘variant.getJavaCompile()’ is obsolete and has been replaced with ‘variant.getJavaCompileP

    2021年10月1日
    105
  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
    84
  • STM32CubeMX介绍、下载与安装

    STM32CubeMX介绍、下载与安装推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang本教程今年更新了部分内容:STM32CubeMX系列教程Ⅰ、写在前面相信很多人都知道STM32CubeMX这个工具,也是近年来开发STM32比较流行的一个工具。这个工具从两年…

    2022年6月12日
    40
  • 虚函数

    虚函数虚函数的定义:虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public(可以定义为privateorproteceted,但是对于多态来说,没有意义。),在基类的类定义中定义虚

    2022年7月4日
    27
  • 消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?

    消息队列之事务消息,RocketMQ 和 Kafka 是如何做的?

    2020年11月20日
    208

发表回复

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

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