另一方面,概念与NACK相对应的是ACK,ACK是到达通知技术。 以TCP为例,这是因为他在接收方收到数据后,会向发送方回复“收到了数据”的信息(ACK ),告诉发送方“收到了”,以确保信息的可靠性。
NACK也是一种通知技术,但触发通知的条件正好与ACK相反,即在没有收到消息时通知发送方“我没有收到消息”,即未达到的通知。
有两种类型的数据定义可以通过rfc4585协议重新发送:
1 ) RTPFB:rtp报文丢失重发。
2 ) PSFB )指定净荷载传递,净荷载传递中分为以下三种
1 .图片丢失视频帧的重传。
2、sli(slicelossindication ) slice丢失并再次旋转。
3、rpsi (参考图片选择)参考帧被丢失并被重新发送。
创建视频连接的SDP协议将协商上述类型的NACK重定向。 以webrtc为例,协商两种NACK。 rtp消息丢包重传的NACK(nack之后是无参数、默认RTPFB )、PLI视频帧丢失重传的nack )。
二.定义
V: 2bit现在固定为2
p:1位绘制
fmt:5b it feedback消息类型。 在RTP FP模式下定义的值如下:
0:未使用
1:通用网络
2-30:unassigned
3: reservedforfutureexpansionoftheidentifiernumberspace
PS FP模式下的定义值如下。
0:未使用
1:图片丢失识别(pli )
2:许可证(sli )。
3:参考图片选择(rpsi )
4-14:未使用
15:应用程序层(AFB )消息
16-30: unassigned
3: reservedforfutureexpansionofthesequencenumberspace
pt : 8位布局类型。
FCI :较长的反馈控制信息。 1、RTPFB
packetidentifier(PID )是丢失的RTP分组的序列号,bitmapoflostpackets (BLP )根据PID表示以下16个RTP分组的丢失状况。 一个NACK消息可携带多个RTP序号,NACK接收方逐个处理这些序号。 以下示例:
数据包标识符(PID )为176。
bitmapoflostpackets(BLP ):0x6ae1。 分析时需要以小模式进行分析。
0x6ae1支持二进制。 110101011100001相反看1000 0111 0101 0110。
1bit表示丢包,0bit表示没有丢包分析,丢失的信息序列号分别如下。
177 182 183 184 186 188 190 191与wireshark分析一致。
2、PSFB 1) PLI FB PT=PSFB FMT=1。
2 ) SLI FB的PT=PSFB,FMT=2。
first 336013位图块(MB )地址块。
number :13 bitsthenumberoflostmacroblocks,in scan order as discussed above。
picture id :6 bitsthesixleastsignificantbitsofthecodec-specifierthatisusedtoreferencethepictureinwhichthelosssofthe or many视频代码,thepictureidisidenticaltothetemporalreference。
3 ) RPSI FB的PT=PSFB,FMT=3。
三、实现webrtc支持RTPFB和PLI FB两种重传方式。
在assignpayloadtypesandaddassociatedrtxcodecs-addefaultfeedbackparams中,将这两种方法记入SDP命令行。
1 ) RTPFB的实现RTPFB在JB中实现。 根据RTP消息的序列号和时间戳,判断有无丢包异常。 请参见实现NackTracker类。
发送方调用堆栈的引用位置为:
平台标题:开始标题
-平台前端:运行
- processthreadimpl : run
- processthreadimpl :3360 process
- paced sender :进程
- paced sender :3360 send packet
- packet router :3360 time to send packet
- modulertprtcpimpl :3360 time to send packet
- RTP sender :3360时间to send packet
- rtppackethistory :3360 getpacketandsetsendtime
- rtppackethistory : get packet
接收方有两种方式的驱动方式NACK
1、包装驱动
设备包
-DeliverRtp
- rtpstreamreceivercontroller :3360 onrtppacket
- RTP demuxer :3360 onrtppacket
- rtpvideostreamreceiver : onrtppacket
- rtpvideostreamreceiver :接收包
- rtpreceiverimpl :3360 incomingrtppacket
- rtpreceivervideo :3360 parsertppacket
- rtpvideostreamreceiver 3360: onreceivedpayloaddata
- nack module :3360 onreceivedpacket
- videoreceivestream : send nack
- rtpvideostreamreceiver 33603360 requestpacketretransmit
- modulertprtcpimpl :3360 send nack
2、定时驱动
nack module :进程
2 ) PLI FB实现PLI FB在webrtc中实现的是请求关键帧。 如果连续解码失败或长期没有解码输入,则在RTCP消息中发送请求IDR帧的命令。 参考videoreceivestream :3360解码、请求密钥帧这两个函数来实现。
四.见https://tools.IETF.org/html/RFC 4585