1

如何关闭或破坏 PeerConnectionInterface 对象?当我试图这样做时它崩溃了。

我有一个像这样声明的对象: rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;

在我通过工厂创建 PeerConnectionInterface 后它工作正常。

但是,当会话结束时,我尝试调用 _peerConnection->Close(); 程序崩溃了。

而且我也尝试调用 _peerConnection.release()->Release(); 也崩溃了。

我在 WebRtc 的源代码的 PeerConnection.cc 中打印日志,发现它在这里崩溃了,在 Close() 函数和 ~PeerConnection() 函数中:

webrtc_session_desc_factory_.reset(); //PeerConnection.cc

声明是 std::unique_ptr<WebRtcSessionDescriptionFactory> webrtc_session_desc_factory_;

于是我继续登录WebRtcSessionDescriptionFactory.cc,~WebRtcSessionDescriptionFactory()函数。在这个函数中崩溃:FailPendingRequests()。

进入FailPendingRequests()函数:

RTC_DCHECK(signaling_thread_->IsCurrent());
  while (!create_session_description_requests_.empty()) {
    const CreateSessionDescriptionRequest& request =
        create_session_description_requests_.front();
    //Crashed here in third or fourth loop
    PostCreateSessionDescriptionFailed(request.observer,
        ((request.type == CreateSessionDescriptionRequest::kOffer) ?
            "CreateOffer" : "CreateAnswer") + reason);
    create_session_description_requests_.pop();
  }

我将非常感谢任何建议!

4

1 回答 1

1

在实现 Kurento Library 时,我在 iOS 中遇到了同样的问题。解决此问题的关键是以正确的方式处理资源。

我遵循的步骤:

创作顺序:

创建 WebRTCPeer 对象

创建 RoomClient 对象

一旦 RoomClient 连接,生成 SDP Offer。

等等。

处置顺序:

首先断开 RoomClient。

密切关注 WebRTC 事件中的“RTCIceConnectionState”、“RTCIceGatheringState”。

一旦“RTCIceConnectionState”关闭并且iceGatheringState 为“RTCIceGatheringStateComplete”,则处理WebRTCPeer 对象。

这样问题就解决了,否则资源被初始化并主要对象被释放,这会导致崩溃。

希望有帮助!

于 2018-06-28T07:33:31.600 回答