1.WebRTC相关概念
1.1WebRTC 简介
WebRTC(Web Real-Time Communication)网页即时通讯,标准是WHATWG协议,它通过简单的API使得浏览器和移动应用程序提供实时通信(RTC)的功能;在不借助中间媒体的情况下,建立浏览器之间的点对点(Peer-to-Peer)的连接,实现音视频流或其他任意数据的传输。 WebRTC是一个由Google发起的实时通讯解决方案,其中包含了视频/音频采集、编码器、数据传输、音视频展示等功能,WebRTC项目的原则是API开源、免费、标准化、浏览器内置,比现有的技术更高效; 在设备方面,不受限于传统互联网应用或者浏览器的终端运行环境,实际上,无论终端运行环境是浏览器、桌面应用、移动设备还是IoT设备,只要IP链接可以到达且符合WebRTC规范就可以进行互通通信;
1.2WebRTC特点
-
跨平台
-
可以在Web、Android、IOS、Windows、macOS、Linux环境下运行WebRTC应用
-
解决了Web端无法捕获音视频的能力,且提供了peer-to-peer(浏览器间)的视频交互
-
-
实时传输
-
传输速度快,低延迟、适合实时性要求较高的应用场景
-
-
音视频引擎
-
强大的音视频处理能力
-
WebRTC的核心层是没有视频的渲染的,视频的渲染是需要应用层去做
-
-
免插件
-
不需要依赖任何插件,打开浏览器即可使用
-
-
强大的打洞能力
-
WebRTC技术包含了使用STUN、ICE、TURN、RTP-over-TCP的关键NAT和防火墙穿透技术,并支持代理
-
-
先进的技术
-
先进的音视频编解码器(Opus和VP8/9),强制加密协议(SRTP和DTLS)和网络地址转换器(ICE&STUN)
-
-
与同级别的FFmepg比较
-
FFmepg的侧重点是多媒体的编辑、音视频的编解码等对视频文件的处理
-
WebRTC的优势在于整个网络中实现音视频的传输,对网络的抖动、丢包、网络的评估,在网络中的各种算法优化保证了音视频传输的稳定性,此外还包括一些回音消除、降噪等的优化,当然WebRTC不仅仅局限于音视频,还在文件传输、即时通讯等领域有较大影响力
-
2.WebRTC整体架构
架构图解
-
接口层
-
暴露给业务侧,业务侧可以使用原生的C++ API接口或者Web API 开发音视频实时通信,核心是RTCPeerConnection
-
-
Session层
-
用于控制业务逻辑,如媒体协商、收集Candidate等
-
-
引擎层
-
包括音视频引擎和网络传输
-
-
设备层
-
主要和硬件交互,负责音频的采集和播放,视频的采集、物理网络等
-
接口层
可以使用浏览器开发音视频直播客户端,也可以使用Native(C++、Android、OC等)开发音视频直播客户端;
Web应用层
Video Conference、Video Call、Remote Education为应用层,指具体的音视频应用,是应用开发人员最关注的; Web开发者可以基于Web API开发基于视频、音频的实时通讯应用;
Web API
Web API部分是Web应用开发者API层,为应用层提供API服务,是应用开发者调用的接口;W3C官方文档地址:www.w3.org/TR/webrtc/
常用 API
-
Network Stream API
-
MediaStream 媒体数据流,如音频流、视频流等;
-
MediaStreamTrack:在浏览器中表示一个媒体源
-
-
RTCPeerConnection包含的核心类
-
RTCPeerConnection 该类很重要,提供了应用层的调用接口,允许两个浏览器之间的直接通讯
-
SDP:用来描述当前连接者想要传输的内容,支持的协议类型、支持的编解码类型等,帮助我们描述媒体流的信息
-
RTCIceCandidate:表示一个ICE协议的候选者-目标节点的IP和端口
-
RTCIceServer:表示一个ICE Server,主要用于当前主机的IP发现,通过和ICE Server通信,可以得到一组可供连接使用的IP:Port候选值,双方通过交换ICE候选值建立连接
-
-
Peer-to-Peer Data API
-
DateChannel:数据通道接口表示一个在两个节点之间的双向数据通道
-
RTCDataChannel 传输非音视频数据,如文字、图片等;
-
-
RTCPeerConnection调用过程
-
Stream流:也就是Media Stream,包含了很多轨,包括了视频、音频等
-
PeerConnection,connection内部有两个线程,一个是work线程,一个是Signaling线程,就是通过PeerConnectionFactoryInterface来创建两个线程,PeerConnectionFactoryInterface实际就是个工厂,可以创建PeerConnection、MediaStream、LocalVideoTrack、localAudioTrack,创建之后会首先创建一个个的轨,然后通过AddTrack添加到MediaStream媒体流中去,
-
有了多个媒体流后需要通过AddStream将其添加到PeerConnection中,他们复用的是同一个Connection
-
-
RTCPeerConnection调用时序图
-
首先是应用层会触发
CreatePeerConnectionFactory
,这样就创造出了PeerConnectionFactory
这个工厂,那么这个工厂呢又触发了CreatePeerConnection
; -
然后创建了一个
PeerConnection
连接,这个工厂还会创建CreateLocalMediaStream
、CreateLocalVideoTrack
、CreateLocalAudioTrack
这些轨; -
之后再通过
AddTrack
将这些轨添加到Stream
中去(也可以通过AddStream方法将媒体流添加到RTCPeerConnection对象中,但几乎已经废弃了),添加完了之后在调用这个AddStream
将这个流添加到PeerConnection
连接中去,流提交好了之后会提交这个流的变化CommitStreamChanges
。 -
当这个流触发变化的时候,就会触发这个事件创建一个
offer
的SDP
的描述信息。 -
有了这个描述 信息之后呢,通过应用层通过信令发送到远端,在这一端 收到这个
offer
SDP
,SDP
里面包括的信息有包括哪些视频哪些音频以及音频格式是什么视频格式是什么?你的传输地址是什么?这些信息实际就度过来了; -
然后根据这些信息远端会回一个
answer
给这个信令,信令与 我们媒体流的信息实际上是两条路,并不是通过TCP
传输的,它是通过UDP
传输的,当这个信令收到这个answer
之后,就会传给这个connection
,然后个连接就拿到了对方这个媒体流信息以及它的传输端口、传输地址。这样他们之间就打通这个通道了,可以相互的传这个媒体数据了。 -
当远端的数据来了之后,这个
Connection
还会将远端的这个流,添加到这个APP
中去,APP
它本身也是一个ConnectionObserver
,这其实是一个观察者,要知道这个连接发生了哪些事件。
-
-
RTCPeerConnection内部事件汇总
C++ API(PeerConnection)
底层API使用C++语言编写,使浏览器厂商容易实现WebRTC标准的Web API,抽象的对数字信号过程进行处理,这一层主要实现了P2P连接
Session 层
主要作用是控制业务逻辑,如媒体协商、收集Candidate等; Session组件是基于libjingle(会话协商+NAT穿透组件库)开发传输会话层
Session Management - 信令管理层
Session Management是一个抽象会话层,提供会话建立和管理功能,该层协议留给开发者自己定义实现,对于Web应用,建议使用websocket技术来管理信令session; 信令主要用于转发会话双方的媒体信息和网络信息;
核心引擎层
音频引擎和视频引擎都是相对独立的,但都要与网络传输层打交道(对应数据的发送(自己端的数据)与接收(其他端的数据)),但由于要进行音视频同步,因此音视频引擎间又存在着某种关联
Transport
是WebRTC的传输层,涉及音视频的数据发送、接收、网络打洞等内容,可以通过STUN和ICE组件来建立不同类型的网络间的呼叫连接; 传输层底层用的是UDP协议,网络传输层包括SRTP、网络I/O多路复用、P2P等;
-
SRTP:一般的正常音视频传输都是用的RTP协议,但由于浏览器对安全性要求较高,因此增加了加密处理模块,采用了SRTP协议,控制流的传输协议是RTCP,对相应的数据发送,接收报告发送给对方,这样对方就可以做流控处理
-
Multplexing:这里主要是多个流复用同一个通道
-
P2P(STUN + TURN + ICE),这里主要是P2P的相关技术,是WebRTC最核心的技术
VoiceEngine
音频引擎是包含一系列音频多媒体处理的框架,包括从音频采集到网络传输端等整个解决方案; (Echo Canceler/ Noise Reduction)内部包括回声消除器、音频编解码器、噪声抑制元件等; NetEQ模块是WebRTC语音引擎中的核心模块,一种动态抖动缓冲和错误隐藏算法,用于隐藏网络抖动和数据包丢失的负面影响,保持尽可能低的延迟,同时保证尽可能高的语音质量;
-
包含模块
-
iSAC/iLBC Codec:主要是编解码
-
NetEQ for voice:
NetEQ
实际上是一个音频缓冲的buffer,用于做网络的适配。如我们做防止音频抖动,这里面涉及了很多相关的算法 -
Echo Canceler/ Noise Reduction:包括回声消除器、噪声抑制元件等复杂算法;
-
VideoEngine
视频处理引擎,包含一系列视频处理的整体框架(视频采集、编解码、加密、图像处理等),从摄像头采集视频到视频信息网络传输再到视频显示,是一个完整过程的解决方案; 内部包括视频图像编解码器(VP8/VP9/H264)、视频抖动缓冲器、图像质量增强器等模块; VP8视频图像编解码器是WebRTC视频引擎的默认编解码器,其适合实时通信应用场景,因为他主要是针对低延时而设计的编解码器;
-
包含模块
-
VP8 Codec:主要是音视频编解码器、如VP8、VP9,后续支持的H264,H265、Open H264、xh264(需要安装插件open H2
-