[issues] webrtc 接入SRS丢包率不正确问题


原因和解决方法

直接原因: SRS暂不支持RTX通道发送nack重传包,重传包以media形式发送,sdk没有区分开来,nack重传包未计入丢包统计,得到的丢包率远低于实际丢包率

解决方法:

  • 1.StreamStatisticianImpl::UpdateOutOfOrder->IsRetransmitOfOldPacket 优化计算重传包函数,可以根据重传包达到时间与RTT比较,将时差长的包计入丢包,粗略计算丢包率。

  • 2.srs 增加rtx 通道发送nack,需要修改SDP协商部分,和rtx编码封包nack重传包.

srs增加rtx

这里简单过来拉流端增加方法

RTX在webrtc SDK里面视频是默认打开RTX的[M88],SRS没有支持,需要先在SRS SDP协商里面解析和分配rtx相关字段.

SDP协商

SrsRtcConnection::negotiate_play_capability 里面分配 rtx_ssrc_, rtx_pt, rtx_apt。其他还有 FID ssrc_groups

    // TODO: FIXME: set audio_payload rtcp_fbs_,
// according by whether downlink is support transport algorithms.
// TODO: FIXME: if we support downlink RTX, MUST assign rtx_ssrc_, rtx_pt, rtx_apt
// not support rtx
vector<SrsMediaPayloadType> rtx_pts = remote_media_desc.find_media_with_encoding_name("rtx");
if (true) {
//srs_freep(track->rtx_);
//track->rtx_ssrc_ = 0;
track->rtx_ssrc_ = SrsRtcSSRCGenerator::instance()->generate_ssrc();
for (size_t i = 0; i < rtx_pts.size(); i++) {
SrsMediaPayloadType rtx_pt = rtx_pts.at(i);
uint8_t pt = ::atol(rtx_pt.format_specific_param_.substr(4, 3).c_str());
if (track->media_->pt_ == pt) {
if (!track->rtx_) {
track->rtx_ = new SrsCodecPayload();
}
track->rtx_->pt_of_publisher_ = track->rtx_->pt_;
track->rtx_->pt_ = rtx_pt.payload_type_;
track->rtx_->sample_ = rtx_pt.clock_rate_;
((SrsRtxPayloadDes*)(track->rtx_))->apt_ = pt;//::atol(rtx_pt.format_specific_param_.c_str());
break;
}
}
}

sdp 协商调试后,sdk 收到的sdp rtx部分大致长这个样子:

a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=ssrc-group:FID 5333335 5333336
a=ssrc:5333335 cname:15817311631_8010
a=ssrc:5333335 msid:stream_id video_label
a=ssrc:5333335 mslabel:stream_id
a=ssrc:5333335 label:video_label
a=ssrc:5333336 cname:15817311631_8010
a=ssrc:5333336 msid:stream_id video_label
a=ssrc:5333336 mslabel:stream_id
a=ssrc:5333336 label:video_label
a=candidate:0 1 udp 2130706431 192.168.6.54 8000 typ host generation 0

构建RTX包

rtx构建很简单,新定义个 SrsRtpRtxPayload, rtp头重写下type 序列号等, payload copy一下 头两个字节写media 的序列号, 对照着SDK里面加,打印下hex调试下即可。

// RTX Payload.
class SrsRtpRtxPayload : public ISrsRtpPayloader
{
public:
char* payload;
int size;
uint16_t sequence_number;
public:
SrsRtpRtxPayload();
virtual ~SrsRtpRtxPayload();
// interface ISrsRtpPayloader
public:
virtual uint64_t nb_bytes();
virtual srs_error_t encode(SrsBuffer* buf);
virtual srs_error_t decode(SrsBuffer* buf);
virtual ISrsRtpPayloader* copy();
}; SrsRtpPacket* SrsRtcSendTrack::build_rtx_packet(
SrsRtpPacket* packet) { SrsRtpPacket* rtx_packet;
SrsRtcTrackDescription* track_desc = get_rtc_track_desc();
SrsRtxPayloadDes* rtx_desc = (SrsRtxPayloadDes*)(track_desc->rtx_); uint8_t pt = packet->header.get_payload_type();
uint8_t ppt = rtx_desc->pt_;
uint8_t apt = rtx_desc->apt_; rtx_packet = packet->copy_with_no_payload();
rtx_packet->header = packet->header;
rtx_packet->header.set_payload_type(ppt);
static uint16_t sequence_number_rtx_ = 1234; //only test
rtx_packet->header.set_sequence(sequence_number_rtx_++);
rtx_packet->header.set_ssrc(track_desc->rtx_ssrc_); char buf[kRtpPacketSize];
SrsBuffer* stream = new SrsBuffer(buf, sizeof(buf));
SrsAutoFree(SrsBuffer, stream); packet->payload()->encode(stream); SrsRtpRtxPayload* rtx_payload = new SrsRtpRtxPayload();
rtx_payload->decode(stream);
rtx_payload->sequence_number = packet->header.get_sequence();
rtx_packet->set_payload(rtx_payload, SrsRtspPacketPayloadTypeRTX);
rtx_packet->retransmission_ = true; return rtx_packet;
}

[issues] webrtc 接入SRS丢包率不正确问题的更多相关文章

  1. [转]网络性能评估工具Iperf详解(可测丢包率)

    原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...

  2. 无线路由器wds桥接技术+丢包率

    半根毛线http://www.cnblogs.com/hsd-/ 今天下午鼓捣了一下无线路由的wds桥接 算是计算机网络的作业 码来分享一下 1.首先设置主路由 我的主路由是斐讯4线 路由ip为192 ...

  3. zabbix使用ICMP Ping模版实现对客户端网络状态的监控,监控丢包率、响应时间

    参考网站: https://www.cnblogs.com/saneri/p/6706578.html 使用fping报错注意事项: https://blog.csdn.net/oqqssh/arti ...

  4. 用ping命令简单的测试 延时、抖动、丢包率

    在DOS命令状态下输入 :ping 202.105.135.211 -t (连续的对该IP地址执行Ping命令,直到被用户以Ctrl+C中断)就会得到下面的结果:Pinging 202.105.135 ...

  5. [转载]UDP丢包率提升

    UDP丢包及无序问题 转载自:http://hi.baidu.com/gamedot/item/96cb9bf1a717eb14d6ff8cd5 最近在做一个项目,在这之前,做了个验证程序. 发现客户 ...

  6. zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间

    zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 之前的博文 使用zabbix3..4的ICMP Ping模版实现对客户端网络状态的监控 https://www.cnblog ...

  7. shell 获取指定ip的丢包率

    shell 获取指定ip的丢包率 丢包率大于10%就重新网络 使用sed 替换字符串 [[ $(ping -c 10 -W 1 baidu.com | awk '$6 ~ /%/{print $6}' ...

  8. 收集TCP端口的访问延迟和丢包率

    需求: 找一款工具可以对TCP 80端口 收集 访问延迟和丢包率 找到的工具: 1.Hping :  http://www.hping.org/ 2.paping : https://docs.azu ...

  9. RFC2544丢包率测试——信而泰网络测试仪实操

    文章关键词:RFC2544.丢包率.吞吐量. 丢包率概述: 丢包率(Frame Loss Rate)测试的目的是确定DUT在不同的负载和帧长度条件下的丢包率.在稳定负载下,由于网络设备资源缺乏,应该正 ...

  10. AR8033 1000M模式下ping包丢包率过大分析与解决

    1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是 ...

随机推荐

  1. win电脑查看wifi密码的方法

    1.使用电脑连接需要查看的WiFi,鼠标右击电脑桌面右下角[WiFi图标],在弹出的菜单中点击[打开"网络和internet"设置]. 2.在弹出的设置窗口中点击[网络和共享中心] ...

  2. react 获取文件流导出功能

    记录一下: 根据后台接口返回的文件流,前端实现导出下载,使用(react+ts) 1.请求方法 (这里写法绕开拦截器) // 导出日志 export async function exportLog( ...

  3. mockjs 加上 json-server 快速生成前端数据

    const mock = require('mockjs'); // 引入mockjs const data = mock.mock({ "data|20": [{ "i ...

  4. 容器内Java微服务报错:unable to create new native thread

    unable to create new native threadhttps://stackoverflow.com/questions/16789288/java-lang-outofmemory ...

  5. MTS和MTO的差别

    一.概念篇 MTS(Make-to-Stock): 按库存生产 可以独立创建计划.生产订单,可以如非限制使用的库存,并且发货等不受限制. 生产的成品或者半成品在系统中建有BOM,开工单生产后记入库存, ...

  6. OO_Lab0总结博客

    OO_Lab0 问题描述 对表达式结构进行建模,将表达式中非必要的括号进行展开并化简. 设定的形式化表述(仅写出部分): 表达式 \(\rightarrow\) 空白项 [加减 空白项] 项 空白项 ...

  7. elasticsearch开发学习及踩坑实录

    1.elasticsearch7.+需要jdk11 / elasticsearch6.+需要jdk8 , 如果是Java开发的同学本地开发使用jdk8 , 可以下载一个解压版的jdk11 , 然后修改 ...

  8. 【CSS】CSS字体图标iconfont

    CSS字体图标iconfont展示的是图标,本质上还是字体 使用字体图标步骤: 字体图标的下载 将字体图标引入到HTML 字体图标的追加(以后添加新的小图标) 推荐下载网站 icomoon字库http ...

  9. 一些狗J8稳定性测试

    1.CTS 2.NTS 3.高温老化 4.DDR 稳定度 5.一些HW 指标

  10. python 连接蓝牙设备并接收数据

    python 连接蓝牙设备 原始内容 # %% from binascii import hexlify import struct from bluepy.btle import Scanner, ...