大家好,又见面了,我是你们的朋友全栈君。
在基于IP网络的多媒体通信系统(比如WebRTC)中,网络丢包对多媒体通信质量有非常严重的影响:例如造成视频的马赛克、图像模糊、帧率下降等问题,造成音频的声音失真、噪声干扰、音频中断等问题。这都会严重影响系统的通信质量,造成非常差的用户体验。
WebRTC主要采取两种手段对抗网络丢包:丢包重传(NACK)和前向纠错(FEC)。FEC是一种前向纠错技术,发送端将负载数据加上一定的冗余纠错码一起发送,接收端根据接收到的纠错码对数据进行差错检测,如果发现差错,则利用纠错码进行纠错。而ULPFEC(Uneven Level Protection FEC,直译为非均等保护前向纠错)则是WebRTC实现的FEC方案之一,[本文深入学习ULPFEC的理论基础和实现细节](http://www.jianshu.com/p/06a27ebacec7)。相关源码在/src/webrtc/modules/rtp_rtcp/source目录下源码实现在 ulpfec_receiver_impl.cc //初始化对象
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功能时,一般都使用red封装格式。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包
}
}发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169589.html原文链接:https://javaforall.cn