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


相关推荐

  • 怎么卸载nodejs(nodejs mongodb)

    Node.js是一个JavaScript运行环境,可以使JavaScript这类脚本语言编写出来的代码运行速度获得极大提升,那么安装后该如何卸载呢?Windows平台下卸载nodejs对于Windows平台来说,所有的应用程序的卸载方法都是一样的。1、在【卸载程序】中卸载程序和功能在桌面左下角单击【开始】按钮,然后选择【控制面板】,在控制面板窗口中找到【卸载程序】,单击打开。打开后可以看到所有已经安装的程序,找到node.js,然后单击右键选择【卸载】等待一会后系统就会提示卸..

    2022年4月18日
    264
  • 安装drupal

    安装drupal1.把汉化文件拷贝到profiles/standard/translations/可以中文安装2.改变一个文件夹属性,cp一个文件。3.建立数据库4.开始安装,导入翻译中进度条卡死,硬盘不响了,刷新一下继续。5.设置网站名称信箱,管理员帐号信箱。6.安装开始,完毕,注意参阅install.txt文件。7.安装必须模块:Administrationmenu;a…

    2022年7月20日
    14
  • 打印星型图「建议收藏」

    打印星型图「建议收藏」打印星型图

    2022年4月24日
    39
  • 本地连接redis_redis入门

    本地连接redis_redis入门通过前面的学习,相信读者对RedisSentinel有了一定的了解,本节将介绍应用方如何正确地连接RedisSentinel。有人会说这有什么难的,已经知道了主节点的ip地址和端口,用对应编程语言的客户端连接主节点不就可以了吗?但试想一下,如果这样使用客户端,客户端连接RedisSentinel和主从复制的Redis又有什么区别呢,如果主节点挂掉了,虽然RedisSentinel可以完成故障转移,但是客户端无法获取这个变化,那么使用RedisSentinel的意义就不大了,所以各个语言

    2022年9月15日
    2
  • 端口被占用问题

    端口被占用问题

    2020年11月9日
    191
  • ES6 数组新增方法

    ES6 数组新增方法目录ES6数组新增方法1、.map2、some和every方法3、filter4、数组新增的reduce方法ES6数组新增方法1、.map.map()给数组中的每一个元素添加特殊处理,返回新的数组实现给定数组添加元letprices=[20,30,40]//20元30元40元letarr=prices.map(item=>item+”元”)给给定数据替换某内容letmovies=[{id:1,name:’逃学…

    2022年5月10日
    38

发表回复

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

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