WebRTC 源码架构深度解析
文档时间: 2026-03
本文从源码目录与类职责出发,解析 WebRTC 的 C++ 核心架构,便于与《WebRTC源码结构与学习路线图》配合使用:前者偏学习路径与依赖关系,本文偏各层实现细节与数据流。
目录
- 整体架构
- [1. API 层 (api/)](#1. API 层 (api/))
- [2. PeerConnection 实现层 (pc/)](#2. PeerConnection 实现层 (pc/))
- [3. 媒体引擎层 (media/)](#3. 媒体引擎层 (media/))
- [4. Call 调度中心 (call/)](#4. Call 调度中心 (call/))
- [5. 视频管线 (video/)](#5. 视频管线 (video/))
- [6. 音频管线 (audio/)](#6. 音频管线 (audio/))
- [7. 核心模块 (modules/)](#7. 核心模块 (modules/))
- [8. P2P/ICE 层 (p2p/)](#8. P2P/ICE 层 (p2p/))
- [9. 基础设施层 (rtc_base/)](#9. 基础设施层 (rtc_base/))
- [10. 线程模型](#10. 线程模型)
- [11. 构建系统](#11. 构建系统)
- [12. 关键信号流总览](#12. 关键信号流总览)
- [13. DataChannel 与 SCTP](#13. DataChannel 与 SCTP)
- [14. transport 与 NetworkController 对应关系](#14. transport 与 NetworkController 对应关系)
- [15. 各层关键文件索引表](#15. 各层关键文件索引表)
- [16. 调试与日志](#16. 调试与日志)
- 延伸阅读
整体架构
┌─────────────────────────────────────────────────────────┐
│ Application Layer │
├─────────────────────────────────────────────────────────┤
│ api/ (Public API - 稳定接口) │
│ PeerConnectionInterface, MediaStreamInterface, ... │
├──────────┬──────────┬───────────────┬───────────────────┤
│ pc/ │ media/ │ call/ │ stats/ │
│ 信令/SDP │ 媒体引擎 │ Call 调度中心 │ 统计 │
├──────────┴──────────┴───────────────┴───────────────────┤
│ audio/ │ video/ │
│ 音频发送/接收流 │ 视频发送/接收流 │
├────────────────────────────┴────────────────────────────┤
│ modules/ (核心模块) │
│ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐ │
│ │rtp_rtcp │ │video_ │ │audio_ │ │audio_ │ │
│ │RTP/RTCP │ │coding │ │coding │ │processing│ │
│ │协议实现 │ │视频编解码 │ │音频编解码 │ │音频处理 │ │
│ └──────────┘ └──────────┘ └────────────┘ └──────────┘ │
│ ┌──────────────────┐ ┌───────────────────────────┐ │
│ │congestion_ │ │pacing │ │
│ │controller (GCC) │ │码率控制/发包平滑 │ │
│ └──────────────────┘ └───────────────────────────┘ │
├─────────────────────────────────────────────────────────┤
│ p2p/ (ICE/STUN/TURN - NAT穿透) │
├─────────────────────────────────────────────────────────┤
│ rtc_base/ (基础设施: 线程, 网络, 日志, 同步) │
└─────────────────────────────────────────────────────────┘
说明 :移动端还有 sdk/ (Android Java/JNI、iOS Obj-C)对 api/ 的封装;编解码与加密依赖 third_party/(如 libvpx、OpenH264、BoringSSL、libyuv、absl 等)。
1. API 层 (api/)
WebRTC 的公开稳定接口,应用程序通过这一层与 WebRTC 交互。
核心入口点
-
api/peer_connection_interface.h(1709 行) --- 最关键的文件PeerConnectionInterface--- 创建 Offer/Answer、管理 Track/Transceiver、ICE 候选PeerConnectionObserver--- 回调接口 (ICE 状态变化、Track 添加等)RTCConfiguration--- 连接配置 (ICE 服务器、Bundle 策略等)
-
api/create_peerconnection_factory.h--- 工厂创建函数cppCreatePeerConnectionFactory( network_thread, worker_thread, signaling_thread, audio_device_module, audio_encoder_factory, audio_decoder_factory, video_encoder_factory, video_decoder_factory, audio_mixer, audio_processing);
典型使用流程
CreatePeerConnectionFactory()创建工厂- 工厂创建
PeerConnection+ 注册Observer AddTrack()/AddTransceiver()添加音视频轨CreateOffer()/CreateAnswer()进行 SDP 协商SetLocalDescription()/SetRemoteDescription()设置会话描述- 处理 ICE 候选交换
- 媒体流开始传输
重要子目录
| 目录 | 内容 |
|---|---|
api/video/ |
视频帧 (VideoFrame)、帧缓冲 (I420/NV12/I010 等) |
api/video_codecs/ |
编解码器工厂接口 (VP8/VP9/H264/H265/AV1) |
api/audio/ |
音频设备、帧、混音器、音频处理接口 |
api/audio_codecs/ |
音频编解码器工厂 (Opus, G711 等) |
api/transport/ |
网络控制、带宽估计、RTP 传输 |
api/units/ |
强类型单位 (DataRate, TimeDelta, Timestamp) |
api/stats/ |
统计对象 (W3C RTCStats 规范) |
api/crypto/ |
加密选项和端到端加密接口 |
api/task_queue/ |
任务队列接口 |
关键设计模式
- 工厂模式:
PeerConnectionFactory、各种编解码器工厂 - 观察者模式:
PeerConnectionObserver、DataChannelObserver、DtlsTransportObserverInterface - 引用计数:
scoped_refptr<T>管理RefCountInterface对象 - 错误处理:
RTCError和RTCErrorOr<T>(11 种错误类型) - 强类型: Units 单位系统,避免原始数值混淆
接收端入口 :应用层通过 PeerConnectionObserver::OnTrack() 收到远端轨;内部对应 pc/ 创建/更新 RtpReceiver,call/ 创建 VideoReceiveStream/AudioReceiveStream,数据经网络 → RtpVideoStreamReceiver → 解码 → 回调/渲染。
2. PeerConnection 实现层 (pc/)
SDP 信令与传输协商的具体实现。
关键类
JsepTransport (pc/jsep_transport.h)
桥接信令层与底层传输:
- 管理三种加密模式: 不加密 / SDES / DTLS-SRTP(最常用)
- 处理 RTCP 复用协商 (
RtcpMuxFilter) - 协商 DTLS 角色 (active/passive)
- 关键方法:
SetLocalJsepTransportDescription()/SetRemoteJsepTransportDescription()AddRemoteCandidates()NegotiateAndSetDtlsParameters()
RtpTransport (pc/rtp_transport.h)
RTP/RTCP 包的传输与分发:
- 通过
RtpDemuxer基于 SSRC/RID/MID 路由数据包到相应的 Sink - 管理 RTP 头部扩展映射
- 维护 RTP 和 RTCP 通道的 ready-to-send 状态
- 关键方法:
SendRtpPacket(),SendRtcpPacket(),DemuxPacket()
RtpSender / RtpReceiver (pc/rtp_sender.h, pc/rtp_receiver.h)
高层 RTP 发送/接收:
AudioRtpSender--- 管理音频轨道、DTMF、音频选项VideoRtpSender--- 管理视频轨道、Simulcast/分层- 基类
RtpSenderBase提供: 轨道管理、参数配置、SSRC 管理
PeerConnectionFactory (pc/peer_connection_factory.h)
- 应用入口,创建 PeerConnection 和媒体轨道
- 管理线程编排 (signaling, worker, network)
- 创建媒体引擎、网络控制器等工厂
SDP 与 JSEP :Offer/Answer 的生成与解析在 pc/ 的 SdpOfferAnswer、JsepSessionDescription 等相关类中实现,遵循 JSEP(Javascript Session Establishment Protocol);设置到传输层通过 JsepTransport::SetLocalJsepTransportDescription() / SetRemoteJsepTransportDescription() 与 ICE/DTLS 协同。
3. 媒体引擎层 (media/)
WebRtcVideoEngine (media/engine/webrtc_video_engine.h)
核心视频引擎:
WebRtcVideoEngine--- 创建发送/接收通道,持有编码器/解码器工厂WebRtcVideoSendChannel--- 管理WebRtcVideoSendStream实例 (每个 SSRC 一个)- 编码器选择与配置
- RTP 扩展和码率约束
- 帧变换器 (encoder-to-packetizer)
WebRtcVideoReceiveChannel--- 管理WebRtcVideoReceiveStream实例- FlexFEC 保护流
- 未信令化的默认接收流
WebRtcVoiceEngine (media/engine/webrtc_voice_engine.h)
核心音频引擎:
- 管理音频设备模块 (ADM)
- 持有音频编码器/解码器工厂
- 提供音频混音器和音频处理 (APM) 访问
- 创建
WebRtcVoiceSendChannel和WebRtcVoiceReceiveChannel
4. Call 调度中心 (call/)
Call 是一次通话的中央调度器,管理所有发送/接收流的生命周期。
Call
├── CreateAudioSendStream() / CreateAudioReceiveStream()
├── CreateVideoSendStream() / CreateVideoReceiveStream()
├── CreateFlexfecReceiveStream()
├── PacketReceiver()
├── BitrateAllocator (码率分配)
│ └── MediaStreamAllocationConfig (每流 min/max/priority)
├── RtpTransportControllerSend (RTP传输控制)
│ ├── GCC 拥塞控制
│ ├── PacedSender (发包平滑)
│ ├── PacketRouter (RTP/RTCP路由)
│ └── NetworkLinkEstimator
├── AudioState (全局音频状态)
│ ├── AudioMixer
│ ├── AudioProcessing
│ └── AudioDeviceModule
└── Stats (带宽、RTT、丢包统计)
关键接口
call/call.h--- Call 主接口call/video_send_stream.h--- 视频发送流接口 (StreamStats: kMedia/kRtx/kFlexfec)call/video_receive_stream.h--- 视频接收流接口call/audio_send_stream.h--- 音频发送流接口call/audio_receive_stream.h--- 音频接收流接口call/bitrate_allocator.h--- 码率分配器 (BitrateAllocatorObserver)call/rtp_transport_controller_send.h--- 发送端 RTP 传输控制
统计 (stats) :api/stats/ 定义 RTCStats 等类型;实际采集由 call/、各 SendStream/ReceiveStream、RTP 模块等上报,通过 PeerConnection::GetStats() 暴露给应用,符合 W3C RTCStats 规范。
5. 视频管线 (video/)
发送管线
VideoSource (摄像头/屏幕)
↓
FrameCadenceAdapter (帧率适配,零帧率模式)
↓
VideoStreamEncoder (编码器管理 + 质量/CPU自适应)
↓
VideoEncoder (H264/VP8/VP9/AV1 具体编码)
↓
SendStatisticsProxy (发送统计)
↓
RtpVideoSender (Simulcast层路由)
↓ 每个 Simulcast 层有独立的:
├── ModuleRtpRtcpImpl2 (RTP/RTCP)
├── RTPSenderVideo (视频RTP打包)
└── VideoFecGenerator (FEC前向纠错)
↓
PacingController (发包平滑)
↓
Transport (网络发送)
核心类
-
VideoStreamEncoder(video/video_stream_encoder.h)- 管理原始帧输入、编码器实例化与配置
- 码率分配和帧丢弃
- 通过
ResourceAdaptationProcessor实现质量/CPU 自适应 - 过载帧检测
-
FrameCadenceAdapter(video/frame_cadence_adapter.h)- 帧率适配器,检测队列过载
- 支持零帧率模式 (idle repeat rate)
-
RtpVideoSender(call/rtp_video_sender.h)- 路由编码帧到对应 Simulcast 层的 RTP 模块
- 管理每层 SSRC 的 RTP/RTCP 模块
- 处理 FEC/RTX 冗余
- 帧加密器集成
-
SendStatisticsProxy(video/send_statistics_proxy.h)- 跟踪编码器输出、视频自适应指标
- 计算码率和帧率统计、质量限制追踪
Simulcast 与 SVC :Simulcast 为多路独立编码(多 SSRC),在 RtpVideoSender 中按层路由;SVC(VP9/AV1 空间/时域分层)在单路流内分层,由编码器与 CodecSpecificInfo 描述,接收端按层解码或丢弃增强层。
接收管线
Network (RTP Packets)
↓
RtpVideoStreamReceiver2 (包接收)
├── NACK 重传请求
├── FEC/RTX 恢复
├── 帧解密 (FrameDecryptorInterface)
└── RTCP 反馈 (loss notification, REMB)
↓
PacketBuffer (RTP包 → 帧组装)
↓
RtpFrameReferenceFinder (参考帧查找)
├── VP9 专用 (rtp_vp9_ref_finder)
├── 通用帧描述符 (rtp_generic_ref_finder)
├── 仅帧ID (rtp_frame_id_only_ref_finder)
└── 仅序列号 (rtp_seq_num_only_ref_finder)
↓
VideoReceiver2 (解码调度)
↓
VideoStreamDecoder2 (解码回调,VCMReceiveCallback)
↓
VideoDecoder (H264/VP8/VP9/AV1 具体解码)
↓
ReceiveStatisticsProxy (接收统计: 帧率、抖动、A/V同步偏移)
↓
VideoSink (渲染)
核心类
-
VideoReceiveStream2(video/video_receive_stream2.h)- 编码 RTP 包接收、帧组装、解码触发、渲染协调
- 实现
CallStatsObserver(RTT/带宽感知)
-
RtpVideoStreamReceiver2(video/rtp_video_stream_receiver2.h)- 实现
RtpPacketSinkInterface - NACK 请求、FEC/RTX 恢复、帧解密、RTCP 反馈
- 实现
6. 音频管线 (audio/)
发送管线
AudioInput (麦克风)
↓
AudioProcessing (APM: 回声消除/降噪/增益控制)
↓
ChannelSend (音频编码 + RTP打包)
↓
Transport (网络发送)
-
AudioSendStream(audio/audio_send_stream.h)- 绑定
ChannelSend(RTP/RTCP 发送器) - 观察
BitrateAllocator更新
- 绑定
-
ChannelSendInterface(audio/channel_send.h)- 编码器选择与修改
- RTCP 处理、RTP 头部扩展
- 拥塞控制对象注册
接收管线
Network (RTP Packets)
↓
ChannelReceive (RTP/RTCP接收 + 解码)
↓
NetEq (自适应抖动缓冲)
↓
AudioMixer (多路混音)
↓
Playout (扬声器播放)
-
AudioReceiveStreamImpl(audio/audio_receive_stream.h)- 作为
AudioMixer::Source向混音器提供解码音频 - 实现
Syncable接口 (音视频同步) - 绑定
ChannelReceive
- 作为
-
ChannelReceiveInterface(audio/channel_receive.h)- RTP/RTCP 包接收、解码器设置
- 音频混音和电平测量
- NetEq 抖动缓冲管理
- 帧变换器集成
7. 核心模块 (modules/)
7.1 视频编解码 (modules/video_coding/)
支持的视频编解码器
| 编解码器 | 位置 | 编码器 | 解码器 | 特性 |
|---|---|---|---|---|
| H.264 | codecs/h264/ |
H264EncoderImpl (OpenH264) |
H264DecoderImpl |
NAL打包模式 (SingleNAL/NonInterleaved),颜色空间处理 |
| VP8 | codecs/vp8/ |
LibvpxVp8Encoder |
LibvpxVp8Decoder |
时域分层 (TemporalLayers),屏幕共享优化 (ScreenshareLayers) |
| VP9 | codecs/vp9/ |
LibvpxVp9Encoder |
LibvpxVp9Decoder |
SVC (最多8空间层),灵活参考帧,帧缓冲池 |
| AV1 | codecs/av1/ |
LibaomAv1Encoder |
dav1d 解码 | SVC 支持,最新一代编解码器 |
编解码器特定信息结构
cpp
// modules/video_coding/include/video_codec_interface.h
union CodecSpecificInfo {
CodecSpecificInfoVP8 vp8; // 时域层ID、图片ID
CodecSpecificInfoVP9 vp9; // 空间层ID、GOF索引、灵活模式
CodecSpecificInfoH264 h264; // 打包模式、IDR标志
};
抖动缓冲与包处理
PacketBuffer(packet_buffer.h) --- RTP 包组装为完整帧H26xPacketBuffer(h26x_packet_buffer.h) --- H.26x 专用包缓冲RtpFrameReferenceFinder(rtp_frame_reference_finder.h) --- 通用参考帧查找- VP9 专用:
RtpVp9RefFinder - 通用帧描述符:
RtpGenericRefFinder - 仅帧ID:
RtpFrameIdOnlyRefFinder - 仅序列号:
RtpSeqNumOnlyRefFinder
- VP9 专用:
丢包处理与控制
NackRequester(nack_requester.h) --- NACK 重传请求FecControllerDefault(fec_controller_default.h) --- 前向纠错控制LossNotificationController(loss_notification_controller.h) --- 丢包通知
7.2 音频编解码 (modules/audio_coding/)
支持的音频编解码器
| 编解码器 | 位置 | 特性 |
|---|---|---|
| Opus | codecs/opus/ |
FEC前向纠错、DTX非连续传输、CBR固定码率、带宽自适应(窄带→全带)、复杂度调节 |
| G.711 | codecs/g711/ |
PCM 传统编码 (A-law/u-law) |
| G.722 | codecs/g722/ |
7kHz 音频带宽 |
| iLBC | codecs/ilbc/ |
低码率窄带 |
| iSAC | codecs/isac/ |
自适应码率,宽带 |
| PCM16 | codecs/pcm16b/ |
原始 PCM |
| RED/CNG | codecs/red/ |
冗余/舒适噪声 |
Opus 编码器详解 (audio_encoder_opus.h)
AudioEncoderOpusImpl
├── 带宽控制: 窄带(4kHz) → 中带(6kHz) → 宽带(8kHz) → 超宽带(12kHz) → 全带(20kHz)
├── FEC (前向纠错): 丢包时可部分恢复
├── DTX (非连续传输): 静音时降低码率
├── CBR 模式: 固定码率
├── 复杂度调节: 0-10,平衡质量与CPU
└── 音频网络自适应: 根据网络状态动态调整
NetEq --- 高级自适应抖动缓冲器 (neteq/)
NetEq 是 WebRTC 音频质量的核心组件,负责在网络抖动下保证流畅播放。
NetEqImpl
├── DelayManager (延迟管理)
│ └── 基于分位数的延迟估计 (forget factor 0.983)
├── DecisionLogic (解码决策)
│ ├── Normal (正常解码)
│ ├── Merge (融合解码)
│ ├── Expand/PLC (丢包隐藏)
│ ├── Accelerate (加速播放 - 追赶延迟)
│ └── PreemptiveExpand (预扩展 - 增加缓冲)
├── PacketBuffer (包缓冲)
├── ComfortNoise (舒适噪声生成)
└── NackTracker (NACK跟踪)
音频网络自适应器 (audio_network_adaptor/)
根据网络状态自适应调整编码器参数:
AudioNetworkAdaptorImpl
├── BitrateController (码率控制)
├── DtxController (DTX开关控制)
├── FrameLengthController (帧长控制 v1 & v2)
├── FecController (FEC控制 - 基于PLR)
├── ChannelController (声道数控制)
└── EventLog (事件日志)
输入信号: 上行带宽、丢包率、RTT、目标码率、开销
7.3 音频处理 (modules/audio_processing/)
323 个实现文件,是最大的模块。
处理管线
采集端管线 (Capture):
AudioInput → HPF(高通滤波) → AEC3(回声消除) → NS(降噪) → AGC2(增益控制) → Output
回放端管线 (Render):
AudioOutput ← 分析音频用作回声参考
回声消除
AEC3 (现代回声消除器) --- aec3/
- 频域回声消除
- 多通道支持
- 舒适噪声注入
- 高级配置:
EchoCanceller3Config
AECM (移动端回声消除) --- aecm/
- 低复杂度,适合移动设备
- CNG 模式、回声模式 (0-4)
- C 接口:
WebRtcAecm_Create,WebRtcAecm_Process
自动增益控制
AGC2 (现代 AGC) --- agc2/
GainController2
├── InputVolumeController (麦克风增益自动调节)
├── AdaptiveDigitalGainController (自适应数字增益)
├── FixedDigitalGain (固定数字增益)
├── Limiter (限幅器 - 防止削波)
├── SpeechLevelEstimator (语音电平估计)
├── SaturationProtector (饱和保护)
└── NoiseLevelEstimator (噪声电平估计)
AGC (旧版) --- agc/ --- 仍然维护
其他处理组件
| 组件 | 位置 | 说明 |
|---|---|---|
| 噪声抑制 (NS) | ns/ |
NoiseSuppressor --- 频域降噪 |
| 语音活动检测 (VAD) | vad/ |
检测是否有语音 |
| 高通滤波 (HPF) | high_pass_filter.h |
去除低频隆隆声 |
| 瞬态抑制 | transient/ |
TransientSuppressor --- 抑制瞬态噪声 |
| 残余回声检测 | echo_detector/ |
ResidualEchoDetector |
| AEC Dump | aec_dump/ |
诊断转储 |
7.4 RTP/RTCP 协议 (modules/rtp_rtcp/)
RTP 发送 (rtp_sender.h)
RTPSender
├── RTP 头部构造与扩展管理
├── NACK 处理 (收到 NACK 后重传)
├── RTX (重传专用通道)
├── 填充包生成 (带宽探测)
├── FEC 集成 (前向纠错)
├── 序列号和时间戳偏移管理
└── 包历史 (用于重传)
RTCP 收发 (rtcp_transceiver.h)
RtcpTransceiver
├── SR (Sender Report) --- 发送端时间戳和统计
├── RR (Receiver Report) --- 丢包率和延迟信息
├── NACK --- 请求重传特定包
├── PLI (Picture Loss Indication) --- 请求关键帧
├── FIR (Full Intra Request) --- 请求完整I帧
├── REMB (Receiver Estimated Max Bitrate) --- 接收端带宽估计
└── 复合包生成 (多个 RTCP 报告合并)
7.5 拥塞控制 (modules/congestion_controller/)
GCC (Google Congestion Control)
GoogCcNetworkController (goog_cc/goog_cc_network_control.h)
GoogCcNetworkController
├── ProbeController (带宽探测)
│ └── 生成探测包验证可用带宽
├── SendSideBandwidthEstimation (发送端带宽估计)
│ ├── DelayBasedBwe (基于延迟的估计)
│ │ └── 分析包到达时间间隔变化
│ ├── LossBasedBweV2 (基于丢包的估计 v2)
│ │ └── 根据丢包率调整估计
│ └── AcknowledgedBitrateEstimator (基于ACK的估计)
├── AlrDetector (应用受限区域检测)
│ └── 检测应用是否充分利用带宽
└── 码率状态机:
├── Increase (无丢包时递增)
├── Hold (检测到丢包时保持)
└── Decrease (严重丢包时降低)
带宽估计详解 (send_side_bandwidth_estimation.h)
SendSideBandwidthEstimation
├── 输入信号:
│ ├── RTCP RR 中的丢包率
│ ├── RTT (往返时延)
│ ├── REMB (接收端估计)
│ └── 延迟梯度
├── 两套丢包估计器:
│ ├── V1 (传统算法)
│ └── V2 (改进版,带回退逻辑)
├── RTT 回退: RTT 超过阈值时降低码率
├── 链路容量跟踪: 维持历史估计供未来使用
└── 输出: 目标码率 (increase/hold/decrease)
接收端拥塞控制 (receive_side_congestion_controller.h)
ReceiveSideCongestionController
├── RemoteEstimatorProxy --- 生成 Transport Feedback
├── RembThrottler --- 节流 REMB 消息发送
└── RemoteBitrateEstimator --- 接收端带宽估计
发包平滑 (modules/pacing/)
PacingController (pacing_controller.h) --- 漏桶算法
PacingController
├── IntervalBudget (当前间隔可发送数据量)
├── BitrateProber (带宽探测包生成)
├── PrioritizedPacketQueue (优先级队列)
├── 突发间隔: 默认 40ms
├── 填充包生成:
│ ├── 带宽探测
│ ├── NAT 绑定保活
│ └── 链路容量估计
└── 数据包和填充包分离管理
8. P2P/ICE 层 (p2p/)
NAT 穿透与连接建立。
核心类
P2PTransportChannel (p2p/base/p2p_transport_channel.h)
ICE 核心实现:
P2PTransportChannel
├── PortAllocatorSession (候选收集)
│ ├── Host 候选 (本地IP)
│ ├── Server Reflexive 候选 (STUN - NAT外部IP)
│ ├── Peer Reflexive 候选 (从对端学习)
│ └── Relay 候选 (TURN 中继)
├── connections_ (所有候选对)
├── selected_connection_ (当前活跃对)
├── remote_candidates_ (远端候选)
├── ice_controller_ (连接选择算法)
└── ICE 状态: kNew → kChecking → kConnected → kCompleted
Connection (p2p/base/connection.h)
单个候选对连接:
Connection
├── StunRequestManager (STUN 连通性检查)
├── rtt_ (RTT 指数移动平均)
├── pings_since_last_response_ (未应答ping)
├── nomination_ (ICE nomination 值)
├── state_ (候选对状态)
└── Write状态: WRITABLE → WRITE_UNRELIABLE → WRITE_INIT → WRITE_TIMEOUT
BasicIceController (p2p/base/basic_ice_controller.h)
连接选择和 ping 算法:
SelectConnectionToPing()--- 选择下一个 ping 的连接ShouldSwitchConnection()--- 判断是否切换到新连接- Ping 间隔逻辑:
- 强连通: 慢速 ping (~20s)
- 弱连通: 快速 ping (~500ms)
PortAllocator (p2p/base/port_allocator.h)
候选收集工厂:
配置标志:
├── PORTALLOCATOR_DISABLE_UDP/TCP --- 禁用特定协议
├── PORTALLOCATOR_DISABLE_STUN/RELAY --- 禁用特定候选类型
├── PORTALLOCATOR_ENABLE_IPV6 --- IPv6 支持
└── PORTALLOCATOR_DISABLE_COSTLY_NETWORKS --- WiFi可用时避免蜂窝
传输安全
DtlsTransportInternal(p2p/base/dtls_transport_internal.h)- DTLS 握手与证书指纹验证
- 角色协商 (active/passive)
- SRTP 密钥材料提取 (DTLS-SRTP)
- 多密码套件和 TLS 版本支持
连接建立完整流程
1. PeerConnectionFactory::CreatePeerConnection()
2. JsepTransport 创建 ICE/DTLS 传输
3. P2PTransportChannel 通过 PortAllocator 收集 ICE 候选
4. 候选通过信令发送到远端
5. 远端候选通过 AddRemoteCandidate() 添加
6. BasicIceController 选择连接进行 ping
7. STUN 连通性检查建立连接
8. DTLS 握手协商加密
9. 连接标记为 writable/receiving
10. 媒体流开始传输
9. 基础设施层 (rtc_base/)
线程与同步
rtc_base/thread.h--- 线程管理,带消息队列rtc_base/synchronization/mutex.h--- 跨平台互斥锁 (Abseil/Windows/POSIX)rtc_base/synchronization/sequence_checker_internal.h--- 线程安全检查rtc_base/platform_thread.h--- 底层线程创建
网络
rtc_base/socket.h--- 抽象 Socket 接口rtc_base/socket_server.h--- 异步 I/O 多路复用rtc_base/async_tcp_socket.h/async_udp_socket.h--- TCP/UDP 实现rtc_base/network.h--- 网络枚举与管理rtc_base/network_monitor.h--- 网络变化监控
日志
cpp
// rtc_base/logging.h
RTC_LOG(LS_INFO) << "Message"; // 常规日志
RTC_DLOG(LS_VERBOSE) << "Debug"; // Debug-only 日志
RTC_LOG_F(LS_WARNING) << "Warn"; // 带函数名
// 级别: LS_VERBOSE < LS_INFO < LS_WARNING < LS_ERROR
线程安全注解
cpp
// rtc_base/thread_annotations.h
class Foo {
Mutex mu_;
int count_ RTC_GUARDED_BY(mu_); // 必须持有 mu_ 才能访问
void Bar() RTC_EXCLUSIVE_LOCKS_REQUIRED(mu_); // 必须持有 mu_ 才能调用
};
10. 线程模型
WebRTC 使用严格的多线程架构,通过编译期注解强制线程安全:
| 线程 | 职责 | 注解宏 |
|---|---|---|
| Signaling Thread | SDP 协商、PeerConnection API、JsepTransport、RtpSender | RTC_DCHECK_RUN_ON(signaling_thread_) |
| Worker Thread | 媒体引擎、编解码、音频处理、RTP 发送 | RTC_DCHECK_RUN_ON(worker_thread_) |
| Network Thread | ICE/DTLS、RTP 包收发、Socket I/O、P2PTransportChannel | RTC_DCHECK_RUN_ON(network_thread_) |
| Encoder TaskQueue | 视频编码专用 | RTC_DCHECK_RUN_ON(encoder_queue_) |
| Decoder TaskQueue | 视频解码专用 | RTC_DCHECK_RUN_ON(decode_queue_) |
| Pacer TaskQueue | 发包平滑、拥塞控制 | RTC_DCHECK_RUN_ON(task_queue_) |
11. 构建系统
使用 GN (Google 的元构建系统) + Ninja:
BUILD.gn--- 主构建文件,定义所有目标webrtc.gni--- WebRTC 特定 GN 变量DEPS--- 依赖声明
主要构建目标
| 目标 | 说明 |
|---|---|
:webrtc |
完整 WebRTC 静态库 |
:dcsctp |
独立 DCSCTP (数据通道) 库 |
:rtc_unittests |
主要单元测试 |
:video_engine_tests |
视频引擎集成测试 |
:webrtc_perf_tests |
性能基准测试 |
条件编译
- 平台: Windows, Linux, macOS, iOS, Android, Fuchsia
- 编解码器: VP8, VP9, H.264, H.265, AV1, DAV1D
- 特性: Protobuf, SCTP, Perfetto tracing
- 架构: ARM, ARM64, x86/x64, NEON, AVX2
12. 关键信号流总览
媒体发送流
应用层 → PeerConnection.AddTrack()
↓
WebRtcVideoSendChannel / WebRtcVoiceSendChannel
↓
Call.CreateVideoSendStream() / CreateAudioSendStream()
↓
VideoStreamEncoder / ChannelSend (编码)
↓
RtpVideoSender / RTPSender (RTP打包)
↓
PacingController (发包平滑)
↓
RtpTransport → JsepTransport → DtlsSrtpTransport (加密)
↓
P2PTransportChannel → Connection (ICE选择的路径)
↓
UDP Socket → Network
带宽自适应流
Remote Peer 发送 RTCP RR (丢包/延迟)
↓
GoogCcNetworkController 处理反馈
↓
SendSideBandwidthEstimation 更新估计
├── DelayBasedBwe (延迟梯度)
├── LossBasedBweV2 (丢包率)
└── AcknowledgedBitrateEstimator (ACK)
↓
目标码率更新 (increase / hold / decrease)
↓
BitrateAllocator 分配到各流
↓
VideoStreamEncoder 调整编码参数 (分辨率/帧率/码率)
↓
PacingController 调整发送速率
13. DataChannel 与 SCTP
DataChannel 提供非音视频的可靠/非可靠数据传输,与媒体流共用同一 PeerConnection 与 DTLS 连接。
| 层级 | 位置 | 说明 |
|---|---|---|
| API | api/data_channel_interface.h |
DataChannelInterface、DataChannelObserver |
| pc/ | pc/sctp_transport.h、pc/data_channel.h |
SctpTransport 管理 SCTP 关联;RtpDataChannel 等将 DataChannel 映射到底层 |
| 传输 | modules/sctp/ 或 third_party/usrsctp (旧)、dcsctp(新) |
SCTP over DTLS;构建目标 :dcsctp 为独立 DCSCTP 库 |
DataChannel 的创建、打开/关闭、消息收发均在 signaling/worker 线程与 SCTP 传输协同完成;与媒体流共享同一 ICE 与 DTLS 连接,不单独建链。
14. transport 与 NetworkController 对应关系
api/transport/ 定义的是网络与控制相关的抽象接口 ,在 call/ 和 modules/congestion_controller/ 中有具体实现,用于带宽估计、码率分配与发送控制。
| API/概念 | 实现位置 | 说明 |
|---|---|---|
| NetworkController | modules/congestion_controller/(如 goog_cc_network_control.h) |
接收 RTCP/TransportFeedback,输出目标码率、探测建议等;GoogCcNetworkController 为默认实现 |
| RtpTransportControllerSend | call/rtp_transport_controller_send.h |
持有 NetworkController、PacedSender、PacketRouter;将控制器输出转为实际发送节奏与路由 |
| BitrateAllocator | call/bitrate_allocator.h |
把总目标码率按配置(min/max/priority)分配到各 Audio/Video SendStream,实现多流间的码率分配 |
| TargetRateInput / 反馈 | api/transport/network_control.h |
目标码率、往返时延、丢包等输入;接收端通过 RTCP RR、Transport Feedback 等反馈到 NetworkController |
数据流 :RTCP 反馈 → NetworkController 更新估计 → 输出目标码率 → RtpTransportControllerSend 更新 PacedSender → BitrateAllocator 分配到各流 → 各 VideoStreamEncoder/AudioSendStream 按分配码率编码。因此阅读"带宽自适应"时,可沿 api/transport → call/rtp_transport_controller_send → modules/congestion_controller 这条线串起来。
15. 各层关键文件索引表(按阅读顺序)
按「从 API 到实现」的阅读顺序,每层可优先看以下文件,便于快速定位与单步调试。
| 顺序 | 目录 | 关键头文件 / 实现 | 说明 |
|---|---|---|---|
| 1 | api/ | peer_connection_interface.h、create_peerconnection_factory.h |
对外接口与工厂入口 |
| 2 | api/ | media_stream_interface.h、video_track_source.h |
媒体流与轨抽象 |
| 3 | pc/ | peer_connection.h / .cc、peer_connection_factory.h |
PC 与工厂实现 |
| 4 | pc/ | jsep_transport.h、rtp_transport.h、sdp_offer_answer.h |
传输与 SDP 协商 |
| 5 | pc/ | rtp_sender.h、rtp_receiver.h、rtp_transceiver.h |
RTP 收发与 Transceiver |
| 6 | call/ | call.h、call.cc |
Call 调度中心 |
| 7 | call/ | video_send_stream.h、video_receive_stream.h、rtp_video_sender.h |
视频流创建与发送 |
| 8 | media/ | webrtc_video_engine.h、webrtc_voice_engine.h |
媒体引擎入口 |
| 9 | video/ | video_stream_encoder.h、rtp_video_stream_receiver2.h |
编码与接收管线 |
| 10 | audio/ | audio_send_stream.h、audio_receive_stream.h、channel_send.h、channel_receive.h |
音频收发与通道 |
| 11 | modules/ | video_coding/(codec 接口、packet_buffer)、rtp_rtcp/rtp_sender.h、rtp_receiver.h |
编解码与 RTP/RTCP |
| 12 | modules/ | congestion_controller/、pacing/pacing_controller.h |
拥塞控制与 pacing |
| 13 | modules/ | audio_processing/、audio_coding/neteq/ |
音频处理与 NetEq |
| 14 | p2p/ | p2p_transport_channel.h、connection.h、dtls_transport_internal.h |
ICE 与 DTLS |
| 15 | rtc_base/ | thread.h、logging.h、socket.h、network.h |
线程、日志、网络基础 |
阅读时建议:先看 .h 了解接口与职责,再在 .cc 中跟关键调用链(如 CreateOffer、OnTrack、PacketReceiver);配合断点与「12. 关键信号流」对照。
16. 调试与日志
16.1 源码内日志(RTC_LOG)
cpp
// rtc_base/logging.h
RTC_LOG(LS_INFO) << "message"; // 各级别:LS_VERBOSE / LS_INFO / LS_WARNING / LS_ERROR
RTC_DLOG(LS_VERBOSE) << "debug only"; // 仅 Debug 构建输出
RTC_LOG_F(LS_WARNING) << "with func"; // 带函数名
- 可通过环境变量或编译选项控制最低日志级别,便于在关键路径打点(如 ICE 状态、收包、码率更新)。
16.2 rtc_event_log
- WebRTC 支持将关键事件(RTP/RTCP 包、码率变化、ICE 事件等)写入 rtc_event_log 二进制日志。
- 回放与解析需使用
rtc_tools/下的工具或 Chrome 的 webrtc-internals;便于离线分析通话质量与行为。
16.3 chrome://webrtc-internals
- 在 Chrome 中打开
chrome://webrtc-internals可查看当前页面的 PeerConnection、ICE 候选、统计信息(getStats)、事件日志等。 - 与源码中的 stats 采集、RTCStats 对应;调试 Web 端或对比 C++ 与浏览器行为时非常有用。
16.4 调试建议
| 场景 | 建议 |
|---|---|
| 跟接收端数据流 | 在 RtpPacketSinkInterface::OnRtpPacket、VideoReceiveStream2 的帧回调、OnTrack 处断点 |
| 跟发送端码率与 pacing | 在 GoogCcNetworkController 输出、BitrateAllocator 分配、PacingController::ProcessPackets 处断点 |
| 跟 ICE/DTLS | 在 P2PTransportChannel、Connection 状态变更、DtlsTransportInternal 握手处断点 |
| 分析离线行为 | 开启 rtc_event_log,用官方工具或脚本解析 |
延伸阅读
- 《WebRTC源码结构与学习路线图》:学习顺序、WHEP 拉流主线、目录依赖与接收端调用链。
- WebRTC 官方文档与 webrtc.googlesource.com 源码。
- IETF JSEP、RTP/RTCP、ICE、DTLS-SRTP 相关草案。