8

我们正在使用licode MCU 将录制的视频从 Google Chrome 流式传输到服务器。没有第二个谷歌浏览器实例来处理反馈,服务器必须这样做。

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

视频质量差

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

我想知道如何修改它,以便它可以从这个数据包丢失中恢复。在当前序列号上提交 NACK 数据包是解决方案吗?我还读到有一种谷歌浏览器提交 RED 数据包(冗余)以处理数据包丢失的模式。

4

1 回答 1

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发送到远程对等方以在出现错误时请求关键帧。

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

只有通过所有这些案例后,您才能查看 FECC/RED,因为它确实更难处理和实施。

于 2015-12-03T17:27:15.743 回答