WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。
参考资料
- Experiment repo: https://github.com/muaz-khan/WebRTC-Experiment
- Mdn doc: https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API
应用场景
- 音视频实时互动
- 游戏、即时通讯、文件传输...
- 音视频处理(回音消除、降噪)
架构概述
上层web api > 核心c++ api > 上下文管理session > 音视频处理传输 > 音视频采集、网络I/O(可自定义)

音频引擎-voice-engine
- iSAC/iLBC: 编解码
- NetEQ: 音频缓冲buffer
- Echo Canceler / Noise Reduction: 回声消除/降噪
视频引擎-video-engine
- VP8 Code: 编辑吗
- Video jitter buffer: 视频缓冲buffer
- Image enhancements: 视频增强(美颜、贴图)
传输-transport
- SRTP: 安全传输协议
- Multiplexing: 多流复用
- P2P: 点对点传输协议
源码目录结构
- api: webrtc接口层,浏览器都是通过该借口调用webrtc
- call: 数据流的管理层,Call代表同一个端点的所有数据的流入流出
- video: 视频处理逻辑
- audio: 音频处理逻辑
- common_audio: 音频算法逻辑
- common_audio: 视频算法逻辑
- media: 与多媒体相关的逻辑处理,如编辑码的逻辑处理
- logging: 日志相关
- module: 核心子模块
- pc: Peer Connection 链接相关的逻辑层
- p2p: 端对端相关代码(stun,turn)
- rtc_base: 基础代码(线程、锁相关的统一接口代码)
- rtc_tool: 音视频相关的工具代码
- tool_webrtc: 测试相关的工具代码(网络模拟器)
- system_wrappers: 与具体操作系统相关的代码(cpu特性、原子操作)
- stats: 存放各种数据统计相关的类
- sdk: 存放Android和IOS层代码(视频的采集、渲染)
modules目录
- audio_coding: 音频编解码相关代码
- audio_device: 音频采集与音频播放相关代码
- audio_mixer: 混音相关代码
- audio_processing: 音频亲后处理相关代码
- bitrate_controller: 码率控制相关代码
- congestion_controller: 流控相关代码
- desktop_capture: 桌面采集相关代码
- pacing: 码率侦测及平滑处理相关代码
- remote_bitrate_estimator: 远端码率估算相关代码
- rtp_rtcp: rtp_rtcp协议相关代码
- video_capture: 视频采集相关代码
- video_coding: 视频编码相关代码
- video_processing: 视频前后处理相关代码
运行机制
轨与流(Track/MediaStream): 沿用轨道不相交的概念,一路音频、视频都称之为"轨"。而流中又包含了音频轨、视频轨、字幕轨
webrtc中重要的类
- MediaStream 媒体流
- RTCPeerConnection 音视频传输逻辑处理的类
- RTCDataChannel 非音视频传输逻辑处理的类
peerconnection调用过程

PeerConnection通过创建工厂<mark>PeerConnectionFactoryInterface</mark>创建出不同的轨<mark>TrackInterface</mark>再通过AddTrack添加到媒体流<mark>MediaStreamInterface</mark>中,在多方通讯中就存在多个<mark>MediaStreamInterface</mark>
peerconnection调用时序图

<mark>CreatePeerConnectionFactory</mark> 创建 <mark>PeerConnectionFactory</mark> 创建 <mark>CreateLocalMediaStream & CreateLocalVideoTrack & CreateLocalAudioTrack</mark> 各种轨,然后添加到流中 <mark>Add tracks to the stream</mark> > 再将流添加到连接当中 <mark>PeerConnection</mark> > 提交流 <mark>CommitStreamChanges</mark> > 当流放生变化时通过 <mark>OnSignalingMessage(offer)</mark> > 信令发送到远端 <mark>Send offer to the remote peer</mark> > offer描述信息中包含了音视频的格式、地址等信息(通过TCP) <mark>Get answer from the remote peer</mark> > 根据媒体信息回复给远端信令连接(通过UDP) <mark>ProcessSignalingMessage</mark> > 连接拿到对方的媒体流信息时就建立起了连接,当接受到远端数据时会把媒体流添加到应用层 <mark>OnAddStream</mark> > 会被应用层连接观察者<mark>PeerConnectionObserver</mark>所监听