[issues] webrtc 接入SRS丢包率不正确问题
[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丢包率不正确问题的更多相关文章
- [转]网络性能评估工具Iperf详解(可测丢包率)
原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...
- 无线路由器wds桥接技术+丢包率
半根毛线http://www.cnblogs.com/hsd-/ 今天下午鼓捣了一下无线路由的wds桥接 算是计算机网络的作业 码来分享一下 1.首先设置主路由 我的主路由是斐讯4线 路由ip为192 ...
- zabbix使用ICMP Ping模版实现对客户端网络状态的监控,监控丢包率、响应时间
参考网站: https://www.cnblogs.com/saneri/p/6706578.html 使用fping报错注意事项: https://blog.csdn.net/oqqssh/arti ...
- 用ping命令简单的测试 延时、抖动、丢包率
在DOS命令状态下输入 :ping 202.105.135.211 -t (连续的对该IP地址执行Ping命令,直到被用户以Ctrl+C中断)就会得到下面的结果:Pinging 202.105.135 ...
- [转载]UDP丢包率提升
UDP丢包及无序问题 转载自:http://hi.baidu.com/gamedot/item/96cb9bf1a717eb14d6ff8cd5 最近在做一个项目,在这之前,做了个验证程序. 发现客户 ...
- zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间
zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 之前的博文 使用zabbix3..4的ICMP Ping模版实现对客户端网络状态的监控 https://www.cnblog ...
- shell 获取指定ip的丢包率
shell 获取指定ip的丢包率 丢包率大于10%就重新网络 使用sed 替换字符串 [[ $(ping -c 10 -W 1 baidu.com | awk '$6 ~ /%/{print $6}' ...
- 收集TCP端口的访问延迟和丢包率
需求: 找一款工具可以对TCP 80端口 收集 访问延迟和丢包率 找到的工具: 1.Hping : http://www.hping.org/ 2.paping : https://docs.azu ...
- RFC2544丢包率测试——信而泰网络测试仪实操
文章关键词:RFC2544.丢包率.吞吐量. 丢包率概述: 丢包率(Frame Loss Rate)测试的目的是确定DUT在不同的负载和帧长度条件下的丢包率.在稳定负载下,由于网络设备资源缺乏,应该正 ...
- AR8033 1000M模式下ping包丢包率过大分析与解决
1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是 ...
随机推荐
- c++学习1 基础关键词
一 "const" 修饰变量 只能被初始化和读取,不能被赋值更改,且必需初始化,不初始化的话会因为读取到随机数而报错. example: const int date=100; c ...
- Vue-数据代理
Vue中的数据代理 数据代理定义 所谓数据代理,就是通过一个对象代理对另一个对象中的属性的操作(读/写).说白了就是操作一个对象上的属性可以读取和修改另一个对象上的属性,这种关系就叫做数据代理. 在V ...
- 关于LAB2中的assert
在LAB2中,测试类里会看到这样一句话 注释的意思是确保VM参数启用 -ea,这是个新东西,平时也没写过,我们来了解一下. assert不同于assertEquals这样的函数,是Java中的一个关键 ...
- Java8中Stream的用法
Java8中Stream的用法 1.概述 Stream APl ( java.util.stream)把真正的函数式编程风格引入到Java中.这是目前为止对Java类库最好的补充,因为Stream A ...
- RabbitMQ和Erlang兼容对比
参考自 https://blog.csdn.net/qq_28169825/article/details/88294663 兼容对比官网链接 https://www.rabbitmq.com/whi ...
- vscode 一些扩展的推荐(前端)
- `Auto Rename Tag`:成对修改 HTML 标签名 - `Bracket Pair Colorizer`:括号匹配高亮 - `Color Highlight`:显示颜色代码的颜色 - ...
- Jmeter 接口自动化 对变量【登录密码】进行加密处理
在我们使用Jmeter测试的过程中,尤其是接口测试,有时候需要对参数进行MD5加密后再进行操作: Jmeter自带的就有MD5加密需要使用的到的jar(注意jmeter版本):commons-code ...
- CF1338E JYPnation
题意:给定一个竞赛图,且其中不包含任意一组三元环 $(a, b, c)$,满足 $a \to d$,$b \to d$,$c \to d$,求每个点两两之间的距离之和(若无法达到即为 $614n$). ...
- toString能转换number类型吗
let num = 60console.log(toString(num)) // [object Undefined] console.log(String(num)) // 60
- AD使用积累 - 板子上开孔的方法
有时候画板子时需要需要在板子上开一些槽孔,可以参考如下两种方法: 第一种方法:封闭曲线转换为槽孔. 1.在机械层画一个封闭图形或者画一根线: 2.选中这个图形或线,选择工具 - 转换 - 以选中的元素 ...