PeerConnection 深度解析三:SetRemoteDescription
2026/4/18 1:32:36 网站建设 项目流程

源码路径:

  • api/peer_connection_interface.h

  • pc/peer_connection.cc

  • pc/sdp_offer_answer.cc

对应规范:W3C WebRTC 1.0 §4.6.2

1、W3C 规范怎么定义 SetRemoteDescription

W3C 规范对 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_ptr<SessionDescriptionInterface> desc,     rtc::scoped_refptr<SetRemoteDescriptionObserverInterface> 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_ptr<SessionDescriptionInterface> desc,     rtc::scoped_refptr<SetRemoteDescriptionObserverInterface> observer) {   RTC_DCHECK_RUN_ON(signaling_thread());   // ... if (IsUnifiedPlan()) {     if (pc_->configuration()->enable_implicit_rollback) {       if (desc->GetType() == SdpType::kOffer &&           signaling_state() == PeerConnectionInterface::kHaveL

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询