PeerConnection 是 WebRTC 中最核心的类,它是 W3C RTCPeerConnection Web API 的 C++ 实现。
它负责管理两个对等端(Peer)之间的整个多媒体会话生命周期,包括信令状态机、媒体协商(SDP Offer/Answer)、网络连接(ICE/STUN/TURN)、加密(DTLS/SRTP)以及媒体流的发送和接收。
PeerConnection 是 WebRTC 的大脑。它不直接处理音频采样或视频像素,而是协调各个子系统(网络、媒体引擎、加密、信令)协同工作,确保两个浏览器或应用之间能够建立稳定、安全、低延迟的多媒体通信通道。
一、核心职责
PeerConnection 主要承担以下责任:
**1, 会话状态机管理:**维护信令状态(Signaling State),如 kStable, kHaveLocalOffer, kHaveRemoteOffer 等。
2, 底层对象创建与初始化: 创建和管理 PortAllocator(用于收集 ICE 候选者)、BaseChannels(音频/视频/数据通道)。
3, 媒体流生命周期管理: 拥有并管理 RtpSender、RtpReceiver、RtpTransceiver 以及关联的 MediaStreamTrack 对象。
4, SDP 描述跟踪: 跟踪当前(Current)和待定(Pending)的本地及远程会话描述。
5, 联合职责:
SDP 的解析与生成。
ICE 连接状态机管理。
统计数据(Stats)的生成。
二,继承的类
cpp
class PeerConnection : public PeerConnectionInternal,
public JsepTransportController::Observer,
public RtpSenderBase::SetStreamsObserver,
public rtc::MessageHandler,
public sigslot::has_slots<> {
}
1, PeerConnectionInternal:
• 实现了公共接口 PeerConnectionInterface 未暴露的内部方法,供 WebRTC 内部其他模块(如 PeerConnectionFactory)调用。
2, JsepTransportController::Observer:
• 监听传输层事件。当 ICE 连接状态改变、新候选者被发现、或 DTLS 握手完成时,JsepTransportController 会通知 PeerConnection,以便其更新上层状态(如 ice_connection_state_)。
3, RtpSenderBase::SetStreamsObserver:
• 监听 RTP 发送器的流变化。当 RtpSender 关联的 MediaStream 发生变化时,通知 PeerConnection 进行相应的状态同步。
4, rtc::MessageHandler:
• 允许 PeerConnection 接收来自其他线程的消息。WebRTC 是多线程架构(信令线程、网络线程、工作线程),此类用于在线程间安全地传递任务。
5, sigslot::has_slots<>:
• 支持信号-槽机制。允许其他对象连接到 PeerConnection 发出的信号(如 OnIceCandidate),实现事件驱动的通知机制。
三、关键功能模块
3.1信令与协商 (Signaling & Negotiation)
• CreateOffer / CreateAnswer: 生成 SDP Offer 或 Answer。
• SetLocalDescription / SetRemoteDescription: 应用本地或远程的 SDP,触发媒体引擎和传输层的配置更新。
• AddIceCandidate: 添加远程 ICE 候选者,建立 P2P 连接路径。
• operations_chain_: 确保信令操作按顺序执行(例如,在 CreateOffer 完成前,SetRemoteDescription 会被排队等待),符合 WebRTC 规范中的"操作链"概念。
3.2 媒体管理 (Media Management)
• AddTrack / RemoveTrack: 添加或移除本地媒体轨道(音频/视频)。
• AddTransceiver: 添加收发器,这是 Unified Plan 语义下的核心概念,控制媒体的发送和接收方向。
• GetSenders / GetReceivers / GetTransceivers: 获取当前的媒体发送/接收对象列表。
• local_streams_ / remote_streams_: 管理本地和远程的 MediaStream 集合。
3.3. 数据传输 (Data Channels)
• CreateDataChannel: 创建 SCTP 数据通道,用于传输非媒体数据(如文本、文件)。
• data_channel_controller_: 内部管理数据通道的控制器。
3.4. 状态监控 (State Monitoring)
• ice_connection_state(): ICE 连接状态(New, Checking, Connected, Failed 等)。
• signaling_state(): 信令状态。
• peer_connection_state(): 整体连接状态。
• GetStats: 收集详细的统计信息(丢包率、比特率、延迟等),返回 RTCStatsReport。
3.5. 内部线程模型
• network_thread(): 处理网络 IO(STUN/TURN/ICE 包)。
• worker_thread(): 处理耗时操作(编码/解码、AEC 处理)。
• signaling_thread(): 处理信令逻辑(SDP 解析、状态机转换)。
• 类成员变量通过 RTC_GUARDED_BY(thread) 宏标记,确保线程安全。
3.6. 重要成员变量示例
• transport_controller_: JsepTransportController 实例,管理所有的 ICE 传输和 DTLS 加密。
• call_: webrtc::Call 实例,底层媒体引擎的核心,负责实际的 RTP 包发送/接收、编码和解码。
• transceivers_: RtpTransceiver 列表,Unified Plan 的核心,每个 Transceiver 对应一个 m-line。
• **`configuration_``: 存储 RTCConfiguration,包括 ICE 服务器、证书、带宽限制等配置。