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
相关推荐
OpenLoong 开源社区2 天前
打破 NAT 限制,零侵入跨网络通信:基于 WebRTC 的透明 TCP 隧道跨网络通信方案
网络协议·tcp/ip·开源·webrtc·openloong开源社区
探鸽小钛5 天前
4G 终端 ES8311 - 挂断一次,下次说话就没声了之解决办法
物联网·音视频·嵌入式·esp32·webrtc
草根大哥6 天前
AI 编程实践之自建视频CDN
音视频·webrtc·低延迟直播·视频cdn·低延迟cdn
EasyCVR6 天前
应急指挥怕延迟?聊聊视频汇聚/视频融合/视频分析EasyCVR平台WebRTC低延迟方案
音视频·webrtc·easycvr
TrueDei7 天前
WebRTC ICE 候选变成 mDNS 地址导致连接失败:原因分析与解决方案
webrtc
中屹指纹浏览器svip10 天前
WebRTC泄露是什么,怎么关闭?
webrtc
海边捡石子10 天前
从零设计一个通用智能电话平台:FreeSWITCH + ESL + AI 实战架构
人工智能·架构·webrtc
音视频牛哥11 天前
不换摄像机,也能接入 WebRTC?SmartMediaKit RTSP/RTMP 转 WHIP 技术实践
音视频·webrtc·smartmediakit·rtsp转whip·rtmp转whip·whip推流·rtsp转webrtc播放
直播技术开发交流13 天前
Android 端 WHIP 协议推流技术实践:相机/录屏/多路转发WHIP实现测试
webrtc·android whip·rtsp转whip·毫秒级实时媒体流·whip低延时推送·whip推送实现·rtsp转webrtc
程序员阿明14 天前
docker搭建视频流服务go2rtc,webRTC
docker·容器·webrtc