WebRTC(一):整体架构

架构总览

模块划分

媒体采集模块

  • 使用浏览器 API:getUserMedia()
  • 采集摄像头(video)、麦克风(audio)。
  • 通过 MediaStreamTrack 管理单轨道。

媒体处理与编解码

  • 编码器(发送端):
    • 音频:Opus、G.711。
    • 视频:VP8、VP9、H.264、AV1。
  • 解码器(接收端):
    • 支持上述编解码格式。
  • 其他处理:
    • AEC(回声消除)、AGC(自动增益)、NS(降噪)等。

RTCPeerConnection 连接管理

核心对象:RTCPeerConnection

  • 管理媒体轨道、协商 SDP、控制网络连接。
  • 与远端建立加密媒体通道。
  • 支持 addTrack() / addTransceiver() 管理轨道。

传输与安全模块

协议栈(底层网络):

协议 作用
ICE NAT 穿透候选路径收集和选择
STUN 获取公网地址,打洞
TURN 中继服务器
DTLS 建立加密通道
SRTP 安全传输媒体流
SCTP 数据通道的基础协议

媒体传输:

  • 使用 RTP/RTCP 发送音视频流。
  • 支持 NACK、PLI、FEC、REMB、TCC 等反馈机制提升媒体质量。

数据通道(RTCDataChannel)

  • 基于 SCTP over DTLS over ICE 实现。
  • 用于传输非媒体数据,类似 WebSocket,但具备 P2P 优势。

信令机制(自定义实现)

WebRTC 不定义信令协议,常用方案:

  • WebSocket
  • HTTP POST/REST
  • MQTT

信令交换内容包括:

  • SDP(Session Description Protocol):音视频能力协商。
  • ICE Candidate:网络地址候选信息。
lua 复制代码
                        +----------------------+
                        |    JavaScript 应用层  |
                        +----------------------+
                          |        |        |
               +----------+        |        +------------------+
               |                   |                           |
     +------------------+  +----------------+         +------------------+
     | getUserMedia()   |  | PeerConnection | <-----> |  DataChannel     |
     +------------------+  +----------------+         +------------------+
               |                   |
        +------+-------------------+-------+
        |      |           |              |
+-------------+ +----------------+ +--------------+
| 音视频采集  | | 编码/解码      | | 传输协议栈   |
+-------------+ +----------------+ +--------------+
                                   | STUN/TURN/ICE |
                                   | DTLS/SRTP/SCTP|

通信流程

rust 复制代码
[用户A]                                    [用户B]
  |                                           |
  | getUserMedia()                            |
  | 采集本地音视频                              |
  |                                           |
  | createOffer()                             |
  | setLocalDescription(offer)                |
  |------------------>  信令服务器  ------------------->|
  |                                setRemoteDescription(offer)
  |                                createAnswer()
  |                                setLocalDescription(answer)
  |<------------------  信令服务器  <-------------------|
  | setRemoteDescription(answer)                        |
  |                                           |
  | ICE candidate gathering and exchange      |
  |<------------------->(STUN/TURN)<------------------>|
  |                                           |
  |       DTLS 握手,SRTP 密钥协商              |
  |                                           |
  |       媒体传输(RTP)+ 控制(RTCP)          |
  |<=========================================>|

服务端组件架构

虽然 WebRTC 是 P2P,但实际场景常常需要以下服务器支撑:

组件 作用 常见实现
Signaling Server 交换 SDP 和 ICE 信息 Node.js + WebSocket、Socket.io
STUN Server 提供公网地址探测 Google STUN、Coturn
TURN Server 中继数据(P2P 失败时) Coturn
SFU(选择转发) 多人通话中只转发媒体流 mediasoup、Janus、Jitsi
MCU(混合转发) 多人通话中混合为一路流 Kurento、Jitsi MCU
相关推荐
Fisher3Star10 小时前
mediasoup Transport详解与代码实现
webrtc
Fisher3Star1 天前
mediasoup中Node.js与Worker进程通信机制
网络·webrtc
911hzh2 天前
Flutter WebRTC iOS 原理解析:从 getUserMedia 到 Texture,讲清视频采集、纹理渲染与远端通话链路
flutter·ios·webrtc
shao9185162 天前
第12章Streaming(下):视频应用(1)——项目八:基于WebRTC+YOLO的实时目标检测
yolo·目标检测·webrtc·gradio·视频流·yolov10·流式传输
三十_3 天前
WebRTC 远端画面无法显示:ICE 与 SDP 时序问题深度解析与解决方案
webrtc
metaRTC5 天前
metaRTC8 成功适配 RTOS:开启 MCU/嵌入式实时音视频新时代
单片机·嵌入式硬件·webrtc·实时音视频·rtos
Fisher3Star5 天前
mediasoup中ip与announceAddress配置要点
webrtc·sdp
小柯博客6 天前
Amazon Kinesis Video Streams C WebRTC SDK 开发实战
c语言·开发语言·网络·stm32·嵌入式硬件·webrtc·yocto
RTC老炮7 天前
WebRTC下FlexFEC算法架构及原理
网络·算法·音视频·webrtc
换个昵称都难8 天前
webrtc源码下载(2026年4月)
webrtc