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
相关推荐
肥or胖1 天前
【音视频协议篇】WebRTC 快速入门
ffmpeg·音视频·webrtc
守城小轩2 天前
WebRTC指纹识别——未来展望(下篇)
chrome·webrtc·chrome devtools·指纹浏览器·浏览器开发
守城小轩2 天前
WebRTC指纹——技术背景(上篇)
webrtc·chrome devtools·指纹浏览器·浏览器开发·超级浏览器
_可乐无糖2 天前
AWS WebRTC:我们的业务模式
云计算·音视频·webrtc·aws
小虎卫远程打卡app2 天前
webRTC合并本地源码修改和官方更新
webrtc
SY.ZHOU3 天前
iOS上使用WebRTC推拉流的案例
ios·音视频·cocoa·webrtc
拾光拾趣录7 天前
WebRTC深度解析:从原理到实战
前端·webrtc
feiyangqingyun7 天前
Qt视音频推流/监控推流/自动重连推流/推流同时保存录像文件到本地/网页打开webrtc预览
qt·webrtc·qt推流·qt保存录像文件
_可乐无糖11 天前
AWS WebRTC 并发 Viewer 拉流失败分析:0.3 秒等待为何如此关键?
云计算·webrtc·aws
2501_9153743519 天前
WebRTC与RTMP
webrtc