WebRTC 源码架构深度解析

WebRTC 源码架构深度解析

文档时间: 2026-03

本文从源码目录与类职责出发,解析 WebRTC 的 C++ 核心架构,便于与《WebRTC源码结构与学习路线图》配合使用:前者偏学习路径与依赖关系,本文偏各层实现细节与数据流。


目录

  1. 整体架构
  2. [1. API 层 (api/)](#1. API 层 (api/))
  3. [2. PeerConnection 实现层 (pc/)](#2. PeerConnection 实现层 (pc/))
  4. [3. 媒体引擎层 (media/)](#3. 媒体引擎层 (media/))
  5. [4. Call 调度中心 (call/)](#4. Call 调度中心 (call/))
  6. [5. 视频管线 (video/)](#5. 视频管线 (video/))
  7. [6. 音频管线 (audio/)](#6. 音频管线 (audio/))
  8. [7. 核心模块 (modules/)](#7. 核心模块 (modules/))
  9. [8. P2P/ICE 层 (p2p/)](#8. P2P/ICE 层 (p2p/))
  10. [9. 基础设施层 (rtc_base/)](#9. 基础设施层 (rtc_base/))
  11. [10. 线程模型](#10. 线程模型)
  12. [11. 构建系统](#11. 构建系统)
  13. [12. 关键信号流总览](#12. 关键信号流总览)
  14. [13. DataChannel 与 SCTP](#13. DataChannel 与 SCTP)
  15. [14. transport 与 NetworkController 对应关系](#14. transport 与 NetworkController 对应关系)
  16. [15. 各层关键文件索引表](#15. 各层关键文件索引表)
  17. [16. 调试与日志](#16. 调试与日志)
  18. 延伸阅读

整体架构

复制代码
┌─────────────────────────────────────────────────────────┐
│                    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 --- 工厂创建函数

    cpp 复制代码
    CreatePeerConnectionFactory(
        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);

典型使用流程

  1. CreatePeerConnectionFactory() 创建工厂
  2. 工厂创建 PeerConnection + 注册 Observer
  3. AddTrack() / AddTransceiver() 添加音视频轨
  4. CreateOffer() / CreateAnswer() 进行 SDP 协商
  5. SetLocalDescription() / SetRemoteDescription() 设置会话描述
  6. 处理 ICE 候选交换
  7. 媒体流开始传输

重要子目录

目录 内容
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、各种编解码器工厂
  • 观察者模式: PeerConnectionObserverDataChannelObserverDtlsTransportObserverInterface
  • 引用计数: scoped_refptr<T> 管理 RefCountInterface 对象
  • 错误处理: RTCErrorRTCErrorOr<T> (11 种错误类型)
  • 强类型: Units 单位系统,避免原始数值混淆

接收端入口 :应用层通过 PeerConnectionObserver::OnTrack() 收到远端轨;内部对应 pc/ 创建/更新 RtpReceivercall/ 创建 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/SdpOfferAnswerJsepSessionDescription 等相关类中实现,遵循 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) 访问
  • 创建 WebRtcVoiceSendChannelWebRtcVoiceReceiveChannel

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
丢包处理与控制
  • 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 DataChannelInterfaceDataChannelObserver
pc/ pc/sctp_transport.hpc/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/transportcall/rtp_transport_controller_sendmodules/congestion_controller 这条线串起来。


15. 各层关键文件索引表(按阅读顺序)

按「从 API 到实现」的阅读顺序,每层可优先看以下文件,便于快速定位与单步调试。

顺序 目录 关键头文件 / 实现 说明
1 api/ peer_connection_interface.hcreate_peerconnection_factory.h 对外接口与工厂入口
2 api/ media_stream_interface.hvideo_track_source.h 媒体流与轨抽象
3 pc/ peer_connection.h / .ccpeer_connection_factory.h PC 与工厂实现
4 pc/ jsep_transport.hrtp_transport.hsdp_offer_answer.h 传输与 SDP 协商
5 pc/ rtp_sender.hrtp_receiver.hrtp_transceiver.h RTP 收发与 Transceiver
6 call/ call.hcall.cc Call 调度中心
7 call/ video_send_stream.hvideo_receive_stream.hrtp_video_sender.h 视频流创建与发送
8 media/ webrtc_video_engine.hwebrtc_voice_engine.h 媒体引擎入口
9 video/ video_stream_encoder.hrtp_video_stream_receiver2.h 编码与接收管线
10 audio/ audio_send_stream.haudio_receive_stream.hchannel_send.hchannel_receive.h 音频收发与通道
11 modules/ video_coding/(codec 接口、packet_buffer)、rtp_rtcp/rtp_sender.hrtp_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.hconnection.hdtls_transport_internal.h ICE 与 DTLS
15 rtc_base/ thread.hlogging.hsocket.hnetwork.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::OnRtpPacketVideoReceiveStream2 的帧回调、OnTrack 处断点
跟发送端码率与 pacing GoogCcNetworkController 输出、BitrateAllocator 分配、PacingController::ProcessPackets 处断点
跟 ICE/DTLS P2PTransportChannelConnection 状态变更、DtlsTransportInternal 握手处断点
分析离线行为 开启 rtc_event_log,用官方工具或脚本解析

延伸阅读

  • 《WebRTC源码结构与学习路线图》:学习顺序、WHEP 拉流主线、目录依赖与接收端调用链。
  • WebRTC 官方文档与 webrtc.googlesource.com 源码。
  • IETF JSEP、RTP/RTCP、ICE、DTLS-SRTP 相关草案。
相关推荐
白露与泡影2 小时前
微服务架构下Spring Session与Redis分布式会话实战全解析
spring·微服务·架构
sbjdhjd3 小时前
RHCE | Web 服务器与 Nginx 全栈详解
linux·nginx·http·云原生·oracle·架构·web
飞飞的AI实验室3 小时前
深度解析:Claude Code 和 OpenClaw 底层架构的设计取舍
架构·ai编程·ai agent·claude code·openclaw
百结2143 小时前
LNMP网站架构与部署
架构
枕布响丸辣3 小时前
LNMP 网站架构与部署全攻略:从零基础到上线运行
架构
闫良呀4 小时前
领域驱动设计 DDD(Domain-Driven Design)软件架构学习笔记
架构·代码规范
毛骗导演4 小时前
万字解析 OpenClaw 源码架构-跨平台应用之MacOS 应用
前端·架构
-Da-5 小时前
【操作系统学习日记】《现代处理器性能的三重奏:ISA架构、流水线与缓存系统》
后端·缓存·架构·系统架构
GISer_Jing6 小时前
OpenClaw架构深度解析:无新技术却爆火的底层逻辑
人工智能·ai·架构·aigc