首页 > 解决方案 > WebRTC iOS 原生 SDK 长期冻结

问题描述

我正在开发一个 iOS 应用程序,该应用程序使用 WebRTC 的本机 SDK 来提供对来自不同摄像机的流的访问。使用的编解码器是 H264/AVC。

尽管大多数相机流都可以正常工作,但有些相机流在首次启动时会一直冻结。看起来这些帧没有被解码,但我不确定如何修复它。

当我启用调试日志记录时,我在 WebRTC 的日志中看到很多以下内容:

(rtp_frame_reference_finder.cc:240):数据包范围为 [21170, 21170] 的通用帧没有 GoP,丢帧。(rtp_frame_reference_finder.cc:240):数据包范围为 [21169, 21169] 的通用帧没有 GoP,丢帧。(video_receive_stream.cc:699):200 毫秒内没有可解码帧,请求关键帧。
(video_receive_stream.cc:699):200 毫秒内没有可解码帧,请求关键帧。

当出现冻结时,从不会调用video_broadcaster.cc上的VideoBroadcaster::OnFrame ,这会阻止整个流流启动。当我在 Xcode 上测试并暂停/取消暂停调试器时,几乎总是流将开始工作,我看到VideoBroadcaster::OnFrame被触发并且帧开始被解码。因此,暂停/取消暂停过程以某种方式解决了问题并启动了流。

在从未设置编码器的 iOS SDK 上。我使用了SDK提供的RTCVideoEncoderFactoryH264编码器。我已经为接口/协议RTCVideoEncoderFactory提供了实现,并尝试覆盖 SDK 中的编码器。在所有这些情况下,都不会调用createEncoder()函数。但是,解码器没有问题,它设置正确。

RTCInboundRTPVideoStream统计报告中,PLICountNACKCount正在稳步增加。我的理解是接收器让其他对等方知道编码视频中存在图片丢失。

由于我不知道究竟是什么阻止了帧被解码,所以我想在 PLICount 或 NACKCount 增加时重新启动流。

如果不经历整个 SDP 提供/回答过程,我怎么能做到这一点?我看到的唯一方法是切换RTCMediaStreamTrack上的isEnabled标志,但这并不能解决我的问题。

我可以更新任何编码/解码参数以重新启动流吗?
暂停/取消暂停修复问题的调试器的原因可能是什么?

标签: ioswebrtcsimplewebrtcwebrtc-androidwebrtc-ios

解决方案


推荐阅读