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

相关推荐
RTC实战笔记12 天前
Android 实时音视频接入教程:媒体补充增强信息(SEI)
音视频·媒体·rtc
潜创微科技12 天前
HDMI1.3 无线传输芯片方案 空旷 150 米量产级音视频方案
音视频
VidDown12 天前
VidDown 工具站:免费、本地优先的开发者工具箱
javascript·编辑器·音视频·视频编解码·视频
换个昵称都难12 天前
音频格式之WAV
音视频
AI创界者12 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频
u1521096484912 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
VidDown13 天前
显卡处理视频技术详解:从硬解码到 NVENC,GPU 如何让视频处理起飞?
javascript·编辑器·音视频·视频编解码·视频
EasyDSS13 天前
全能音视频平台/私有化音视频系统EasyDSS!直播/点播/会议/集群对讲一站式落地
音视频
Damon_X13 天前
车载音频复习
音视频
3DVisionary13 天前
告别数据中断:XTDIC-VG视频引伸计在金属疲劳测试中3个真实案例
人工智能·音视频·应用案例·xtdic-vg·视频引伸计·疲劳测试·实战复盘