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

Posted

技术标签:

【中文标题】通过 WebRTC 将视频对等点录制到服务器时如何处理数据包丢失【英文标题】:How do I handle packet loss when recording video peer to server via WebRTC 【发布时间】:2016-02-20 20:26:32 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    传输层 (RTP/RTCP) 编解码器层

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

    抖动缓冲区(处理数据包延迟和重新排序) Generick RTCP Feedbacks(通知源对端丢包)

在编解码器层上,还有一些机制可以解决质量下降问题:

    Codec Layer RTCP Feedbacks Forward error correction (FECC/RED)

要克服Licode 的缺陷,您应该:

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

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

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

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

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

【讨论】:

以上是关于通过 WebRTC 将视频对等点录制到服务器时如何处理数据包丢失的主要内容,如果未能解决你的问题,请参考以下文章

检测 WebRTC 连接中的离线对等点

使用 webrtc 时 ReplayKit 不起作用

是否可以将 WebRTC SDP 报价转换为答案?

在 webrtc 视频聊天中检测到对等方的浏览器已关闭

使用 WebRtc 和本地点对点连接构建视频流应用程序?

为点对点广播转发 WebRTC 视频