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

相关推荐
潜创微科技2 小时前
4K60 over IP 方案简介
网络·嵌入式硬件·网络协议·tcp/ip·音视频
超哥--3 小时前
B站视频内容智能分析系统(三):B站视频自动采集
java·开发语言·音视频·ai编程
换个昵称都难8 小时前
webrtc neteq Nack_tracker重发(ARQ 的nack技术) 介绍
webrtc
localbob9 小时前
日语视频 SRT 字幕生成软件下载:日语视频本地自动翻译SRT字幕生成、日语视频自动翻译 Faster Whisper v1.7 下载与使用教程(含AMD显卡支持)
whisper·音视频·机器翻译·日语字幕翻译·日语视频翻译·本地ai翻译日语视频
简简单单lym10 小时前
WebRTC进阶--red+ulpfec深度解析3-FEC--冗余控制机制深度解析
开发语言·webrtc
音乐宝贝家10 小时前
吉他桶型技术解析:GA桶 vs D桶 vs OM桶——入门弹唱选哪个
新媒体运营·音视频·业界资讯·媒体·材质·零售·内容运营
luoyayun36111 小时前
Qt + FFmpeg 实战:获取音视频文件基础属性、流信息和元数据
qt·ffmpeg·音视频·元数据·获取音视频文件属性
Rudon滨海渔村11 小时前
ffmpeg裁剪视频黑屏、不准时等处理方式 - ffmpeg基本操作
ffmpeg·音视频
谁刺我心12 小时前
[QtCPP]Examples使用示例-QtMultimedia、QMediaPlayer、Audio音频引擎测试mp3播放
qt·音视频·qml