PeerConnection 深度解析三:SetRemoteDescription

张开发
2026/4/18 1:32:38 15 分钟阅读

分享文章

PeerConnection 深度解析三:SetRemoteDescription
源码路径:api/peer_connection_interface.hpc/peer_connection.ccpc/sdp_offer_answer.cc对应规范:W3C WebRTC 1.0 §4.6.21、W3C 规范怎么定义 SetRemoteDescriptionW3C 规范对setRemoteDescription()的核心要求:将对端的 SDP 描述设置为远端描述,根据描述内容驱动本端 Transceiver 状态更新、Track 创建/移除、信令状态机推进。与SetLocalDescription相比,SetRemoteDescription多了一项关键职责: 触发OnTrack/OnAddTrack回调,通知应用层对端的媒体轨道已就绪。规范要求:同样必须通过OperationsChain串行执行设置成功后信令状态按规则推进Offer 时创建/更新 Transceiver,并触发ontrack事件Answer 时确认方向,绑定 DtlsTransport支持Implicit Rollback(Unified Plan 下收到新 Offer 时自动回滚旧 Offer)2、接口签名// api/peer_connection_interface.h virtual void SetRemoteDescription( std::unique_ptrSessionDescriptionInterface desc, rtc::scoped_refptrSetRemoteDescriptionObserverInterface observer) = 0;与 SetLocalDescription 对称,同样是 Observer 异步回调。3、完整调用链应用层 pc-SetRemoteDescription(desc, observer) │ ▼ [Signaling Thread 断言] PeerConnection::SetRemoteDescription() │ 委托 sdp_handler_ ▼ SdpOfferAnswerHandler::SetRemoteDescription() │ 入 OperationsChain 串行队列 ▼ SdpOfferAnswerHandler::DoSetRemoteDescription() │ ├── ① Implicit Rollback 处理 ├── ② FillInMissingRemoteMids(兼容旧端点) ├── ③ ValidateSessionDescription(SDP 合法性校验) ├── ④ ApplyRemoteDescription(核心落地) │ ├── 更新描述槽位(pending/current) │ ├── PushdownTransportDescription(ICE+DTLS 下推) │ ├── UpdateTransceiversAndDataChannels(Transceiver 同步) │ ├── UpdateSessionState(状态机推进 + 媒体参数下推) │ ├── UseCandidatesInSessionDescription(应用内嵌候选) │ ├── CheckForRemoteIceRestart(ICE Restart 检测) │ ├── IceConnectionState → Checking │ └── OnTrack / OnAddTrack / OnRemoveTrack 回调触发 │ ├── ⑤ Answer 时 RemoveStoppedTransceivers └── ⑥ observer-OnSetRemoteDescriptionComplete(OK)4、DoSetRemoteDescription:入口与前置处理void SdpOfferAnswerHandler::DoSetRemoteDescription( std::unique_ptrSessionDescriptionInterface desc, rtc::scoped_refptrSetRemoteDescriptionObserverInterface observer) { RTC_DCHECK_RUN_ON(signaling_thread()); // ... if(IsUnifiedPlan()) { if(pc_-configuration()-enable_implicit_rollback) { if(desc-GetType() == SdpType::kOffer signaling_state() == PeerConnectionInterface::kHaveL

更多文章