webrtc中H264码流ulpfec与nack的联系

由于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的使用场景非常有限.

你可能感兴趣的:(c++)