webrtc PeerConnection 模块介绍

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 服务器、证书、带宽限制等配置。

相关推荐
FlightYe27 分钟前
音视频修炼之容器与协议(一):MP4和MOV的box剖析
android·linux·c++·ffmpeg·音视频
直播技术开发交流1 小时前
Android 端 WHIP 协议推流技术实践:相机/录屏/多路转发WHIP实现测试
webrtc·android whip·rtsp转whip·毫秒级实时媒体流·whip低延时推送·whip推送实现·rtsp转webrtc
智能直播1 小时前
RK3576 + NDI 框架:HX2 编码输出与 HX2/FULL介绍
音视频·实时音视频·视频编解码
TK泰妞3 小时前
AI 带货视频工具怎么选?电商短视频创作者的实用评估指南
人工智能·音视频
EasyDSS3 小时前
告别单一场景局限!一套视频会议/直播/点播/集群对讲EasyDSS音视频平台四大功能解析
音视频·媒体·easydss
龙腾-虎跃1 天前
基于 SIP 协议的自研电话终端:FreeSWITCH 语音与视频通信实战
android·音视频·freeswitch·sip协议终端·wertc
2601_965619691 天前
AI视频制作:财经数据可视化视频怎么做:AI 自动生成图表动画的实操流程
人工智能·nginx·音视频
2601_965619691 天前
历史解说视频怎么做:青铜器瓷器文物画面自动对齐的完整教程
运维·nginx·音视频
2601_965454231 天前
AI视频制作:券商研报怎么转口播视频:PDF 解读、配音和图表自动成片的方法
人工智能·pdf·音视频
Latchh1 天前
iLovePDF免费版能批量压缩吗?4款替代对比2026
图像处理·人工智能·计算机视觉·音视频