WebRTC RTCP的PLI关键帧请求

关键帧请求

  • PLI(Picture Loss Indication)
  • SLI(Slice Loss Indication)

发送方接收到接收方反馈的 PLI 或 SLI 需要重新让编码器生成关键帧并发送给接收端。

  • FIR(Full Intra Request)

这里面 Intra 的含义是图像内编码,不需要其他图像信息即可解码;Inter 指图像间编码,解码需要参考帧。所以 Intra Frame 其实就是指 I 帧,Inter Frame 指 P 帧或 B 帧。

那么为什么在 PLI 和 SLI 之外还需要一个 FIR 呢?

原因是使用场景不同,FIR 更多是在一个中心化的 Video Conference 中,新的参与者加入,就需要发送一个 FIR,其他的参与者给他发送一个关键帧这样才能解码,而 PLI 和 SLI 的含义更多是在发生丢包或解码错误时使用。

在网络环境不是太好的情况下,比如网络拥塞比较严重,丢包率可能比较高,简单实用NACK申请重传的机制,这样就会有大量的RTCP NACK报文,发送端收到相应的报文,又会发送大量指定的RTP报文,反而会增加网络的拥塞程度,可能导致更高的丢包率,导致接收端解码失败,导致花屏等马赛克现象。这时采用申请I帧的方式可能会解决马赛克等现象,申请的I帧方式主要PLI(Picture Loss Indication)和FIR(Full Intra Request)两种方式,FIR又包括RFC2032和RFC5104规定的两种方式,其中RFC5104规定的FIR报文比较常用。一般发送端在收到接收端发送过来的RTCP PLI报文,按申请I帧处理,当然收到FIR报文,就是申请I帧,PLI报文和FIR(RFC5104)的报文如下图:

图片
图片
int rtcp_pli_pack(struct rtp_context* ctx, uint8_t* ptr, int bytes ,uint32_t newssrcr)
{
  /*
  @doc: https://tools.ietf.org/html/rfc4585#section-6.1
    0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|   FMT   |       PT      |          length               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of packet sender                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of media source                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   :            Feedback Control Information (FCI)                 :
   :                                                               :
   */
  rtcp_header_t header;

  if (bytes < 12)
    return 12;

  header.v = 2;
  header.p = 0;
  header.pt = RTCP_PSFB;
  header.rc = 1; // self only /* FMT=1 */
  header.length =2 ;
  nbo_write_rtcp_header(ptr, &header);
  nbo_w32(ptr + 4, ctx->self->ssrc);
  nbo_w32(ptr + 8, newssrcr /*>> 32*/);
  return 12;

}

注:newssrcr 这个是从对方sdp的ssrc里面获取 如下:


a=ssrc:3406697873 cname:janus
a=ssrc:3406697873 msid:janus janusv0
a=ssrc:3406697873 mslabel:janus
a=ssrc:3406697873 label:janusv0
a=ssrc:2258376012 cname:janus
a=ssrc:2258376012 msid:janus janusv0
a=ssrc:2258376012 mslabel:janus
a=ssrc:2258376012 label:janusv0

参考

  • [1] webrtc
  • [2] RFC4585

作者:Aliveyun

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论