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

Jay*_* P. 8 google-chrome packet-loss webrtc licode

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

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

视频质量差

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

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

小智 5

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

  1. 传输层(RTP/RTCP
  2. 编解码层

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

  1. 抖动缓冲器(处理数据包延迟和重新排序)
  2. Generick RTCP 反馈(通知源对等方数据包丢失)

在编解码器层上,还有一些与质量下降作斗争的机制:

  1. 编解码器层 RTCP 反馈
  2. 前向纠错(FECC/RED)

为了克服Licode 的缺陷,您应该:

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

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

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

请注意,p.2,3 需要适当的显式协商(通过 SDP)。

只有在通过了所有这些情况之后,您才可以看看 FECC/RED,因为它确实更难以处理和实施。