由于H264的rtp中不能区分视频流中是否每一帧的图像都连续,对于丢帧的情况无法处理,所以fec+nack会导致fec包丢失后,nack去申请重传fec的包.造成带宽的浪费.
在rtp_video_sender.cc中,检测如下:
// Payload types without picture ID cannot determine that a stream is complete
// without retransmitting FEC, so using ULPFEC + NACK for H.264 (for instance)
// is a waste of bandwidth since FEC packets still have to be transmitted.
// Note that this is not the case with FlexFEC.
if (nack_enabled && IsUlpfecEnabled() &&
!PayloadTypeSupportsSkippingFecPackets(rtp_config.payload_name)) {
printf("nack enable\n");
RTC_LOG(LS_WARNING)
<< "Transmitting payload type without picture ID using "
"NACK+ULPFEC is a waste of bandwidth since ULPFEC packets "
"also have to be retransmitted. Disabling ULPFEC.";
DisableRedAndUlpfec();
}
nack开启之后,会关闭ulpfec机制.
注意nack不影响flexfec的处理.
如果想测试ulpfec机制,则需要关闭nack的机制.
在call_test.cc中,设置nack的rtp缓存为0,就可以关闭nack机制了
const int CallTest::kNackRtpHistoryMs = 0;//1000;//nack switch
可见ulpfec的使用场景非常有限.