通过 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 将视频对等点录制到服务器时如何处理数据包丢失的主要内容,如果未能解决你的问题,请参考以下文章