通过 WebRTC 对等服务器录制视频时如何处理数据包丢失
How do I handle packet loss when recording video peer to server via WebRTC
我们正在使用 licode MCU 将录制的视频从 Google Chrome 流式传输到服务器。没有 Google Chrome 的第二个实例来处理反馈,服务器必须这样做。
我们遇到的一件事是丢包时帧丢失并且视频不同步。这会导致视频质量很差。
在ExternalOutput.cpp中有一个place检测到当前接收到的数据包没有单调递增。在这里你可以看到它丢弃了当前帧并重置了搜索状态。
我想知道如何修改它以便它可以从丢包中恢复。在当前序列号上提交 NACK 数据包是解决方案吗?我还读到有一种模式 Google chrome 提交红色数据包(冗余)来处理数据包丢失。
媒体处理应用有两个主要的不同层:
- 传输层(RTP/RTCP)
- 编解码器层
传输层独立于编解码器并处理RTP/generic RTCP 数据包。在这一层上,有几种机制可以处理数据包 lost/delay/reordering:
- 抖动缓冲区(处理数据包延迟和重新排序)
- Generick RTCP Feedbacks(通知源端数据包丢失)
在编解码器层上,还有一些机制可以解决质量下降问题:
要克服 Licode 缺陷,您应该:
首先,它忽略任何数据包延迟和重新排序。因此,您应该实施机制(抖动缓冲区),它将处理数据包 reodering/network 抖动并确定数据包丢失(可能,您可以重用 webrtc/freeswitch 机制)
当您的应用确定数据包丢失时,您应该向远程对等方发送反馈 (RTCP NACK)
此外,您还应该尝试处理 ffmpeg (used for decoding video and saving it to file) decoding errors and send FIR (Fast Intra Request)/PLI 远程对等点以在出现错误时请求关键帧。
请注意,第 2、3 页需要适当的显式协商(通过 SDP)。
只有通过所有这些情况后,您才能查看FECC/RED,因为它确实更难处理和实施。
我们正在使用 licode MCU 将录制的视频从 Google Chrome 流式传输到服务器。没有 Google Chrome 的第二个实例来处理反馈,服务器必须这样做。
我们遇到的一件事是丢包时帧丢失并且视频不同步。这会导致视频质量很差。
在ExternalOutput.cpp中有一个place检测到当前接收到的数据包没有单调递增。在这里你可以看到它丢弃了当前帧并重置了搜索状态。
我想知道如何修改它以便它可以从丢包中恢复。在当前序列号上提交 NACK 数据包是解决方案吗?我还读到有一种模式 Google chrome 提交红色数据包(冗余)来处理数据包丢失。
媒体处理应用有两个主要的不同层:
- 传输层(RTP/RTCP)
- 编解码器层
传输层独立于编解码器并处理RTP/generic RTCP 数据包。在这一层上,有几种机制可以处理数据包 lost/delay/reordering:
- 抖动缓冲区(处理数据包延迟和重新排序)
- Generick RTCP Feedbacks(通知源端数据包丢失)
在编解码器层上,还有一些机制可以解决质量下降问题:
要克服 Licode 缺陷,您应该:
首先,它忽略任何数据包延迟和重新排序。因此,您应该实施机制(抖动缓冲区),它将处理数据包 reodering/network 抖动并确定数据包丢失(可能,您可以重用 webrtc/freeswitch 机制)
当您的应用确定数据包丢失时,您应该向远程对等方发送反馈 (RTCP NACK)
此外,您还应该尝试处理 ffmpeg (used for decoding video and saving it to file) decoding errors and send FIR (Fast Intra Request)/PLI 远程对等点以在出现错误时请求关键帧。
请注意,第 2、3 页需要适当的显式协商(通过 SDP)。
只有通过所有这些情况后,您才能查看FECC/RED,因为它确实更难处理和实施。