如何通过WebRTC将视频对等设备录制到服务器时处理数据包丢失

时间:2015-11-18 22:02:04

标签: google-chrome webrtc packet-loss licode

我们正在使用licode MCU将录制的视频从Google Chrome流式传输到服务器。 Google Chrome没有第二个实例来处理反馈,服务器必须执行此操作。

我们遇到的一件事是当丢包丢失帧并且视频不同步时。这会导致非常差的视频质量。

poor video quality

在ExternalOutput.cpp中有一个place,它检测到当前收到的数据包没有单调增加。在这里你可以看到它丢弃当前帧并重置搜索状态。

我想知道如何修改它,以便它可以从此数据包丢失中恢复。是否在当前序列号上提交NACK数据包?我还读到有一种模式,谷歌Chrome提交RED数据包(冗余)来处理数据包丢失。

1 个答案:

答案 0 :(得分:4)

媒体处理应用程序有两个主要的不同层:

  1. 传输层(RTP/RTCP
  2. 编解码器层
  3. 传输层与编解码器无关,可处理RTP /通用RTCP数据包。在这一层,有几种机制可以解决数据包丢失/延迟/重新排序问题:

    1. 抖动缓冲区(处理数据包延迟和重新排序)
    2. Generick RTCP Feedbacks(通知源对等方丢失数据包)
    3. 在编解码器层上,还有一些机制可以解决质量下降问题:

      1. Codec Layer RTCP Feedbacks
      2. Forward error correction (FECC/RED)
      3. 要克服Licode瑕疵,您应该:

        1. 首先,它忽略了任何数据包延迟和重新排序。因此,您应该实现机制(抖动缓冲区),它将处理数据包重新排序/网络抖动并确定数据包丢失(可能,您可以重用webrtc / freeswitch机制)

        2. 当您的应用确定数据包丢失时,您应该向远程对等方发送反馈(RTCP NACK

        3. 此外,您应该尝试处理ffmpeg(用于解码视频并将其保存到文件中)解码错误,并向远程对等方发送FIR(快速帧内请求)/ PLI以请求关键帧如果有错误。

        4. 请注意,第2,3页需要进行适当的明确协商(通过SDP)。

          只有在通过所有这些案例之后,你才能看看FECC / RED,因为它的处理和实施更加困难。