WebRTC架构简介

1、WebRTC目的
       
       WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web开发者也无需关注多媒体的数字信号处理过程,只需编写简单的Javascript程序即可实现,W3C等组织正在制定Javascript 标准API,目前是WebRTC 1.0版本,Draft状态, 网址;另外WebRTC还希望能够建立一个多互联网浏览器间健壮的实时通信的平台,形成开发者与浏览器厂商良好的生态环境。同时,Google也希望和致力于让WebRTC的技术成为HTML5标准之一,可见Google布局之深远。


2、WebRTC架构图



架构图颜色标识说明:
(1)紫色部分是Web开发者API层;
(2)蓝色实线部分是面向浏览器厂商的API层(也就是红色框标内模块,也是本人专注研究的部分)
(3)蓝色虚线部分浏览器厂商可以自定义实现

3、WebRTC架构组件介绍


(1) Your Web App
Web开发者开发的程序,Web开发者可以基于集成WebRTC的浏览器提供的web API开发基于视频、音频的实时通信应用。

(2) Web API
面向第三方开发者的WebRTC标准API(Javascript),使开发者能够容易地开发出类似于网络视频聊天的web应用,最新的标准化进程可以查看 这里

(3) WebRTC Native C++ API
本地C++ API层,使浏览器厂商容易实现WebRTC标准的Web API,抽象地对数字信号过程进行处理。

(4) Transport / Session
传输/会话层
会话层组件采用了libjingle库的部分组件实现,无须使用xmpp/jingle协议

a.  RTP Stack协议栈
Real Time Protocol

b.  STUN/ICE
可以通过STUN和ICE组件来建立不同类型网络间的呼叫连接。

c.  Session Management
一个抽象的会话层,提供会话建立和管理功能。该层协议留给应用开发者自定义实现。

(5) VoiceEngine
音频引擎是包含一系列音频多媒体处理的框架,包括从视频采集卡到网络传输端等整个 解决方案
PS:VoiceEngine是WebRTC极具价值的技术之一,是Google收购GIPS公司后开源的。在VoIP上,技术业界领先,后面的文章会详细了解

a.  iSAC
Internet Speech Audio Codec
针对VoIP和音频流的宽带和超宽带音频编解码器,是WebRTC音频引擎的默认的编解码器
采样频率:16khz,24khz,32khz;(默认为16khz)
自适应速率为10kbit/s ~ 52kbit/;
自适应包大小:30~60ms;
算法延时:frame + 3ms

b.  iLBC
Internet Low Bitrate Codec
VoIP音频流的窄带语音编解码器
采样频率:8khz;
20ms帧比特率为15.2kbps
30ms帧比特率为13.33kbps
标准由IETF RFC3951和RFC3952定义

c.  NetEQ for Voice
针对音频软件实现的语音信号处理元件
NetEQ算法:自适应抖动控制算法以及语音包丢失隐藏算法。使其能够快速且高解析度地适应不断变化的网络环境,确保音质优美且缓冲延迟最小。
是GIPS公司独步天下的技术,能够有效的处理由于网络抖动和语音包丢失时候对语音质量产生的影响。
PS: NetEQ 也是WebRTC中一个极具价值的技术,对于提高VoIP质量有明显效果,加以AEC\NR\AGC等模块集成使用,效果更好。

d.  Acoustic Echo Canceler (AEC)
回声消除器是一个基于软件的信号处理元件,能实时的去除mic采集到的回声。

e.  Noise Reduction (NR)
噪声抑制也是一个基于软件的信号处理元件,用于消除与相关VoIP的某些类型的背景噪声(嘶嘶声,风扇噪音等等… …)

(6) VideoEngine
WebRTC视频处理引擎
VideoEngine是包含一系列视频处理的整体框架,从摄像头采集视频到视频信息网络传输再到视频显示整个完整过程的解决方案。

a.  VP8
视频图像编解码器,是WebRTC视频引擎的默认的编解码器
VP8适合实时通信应用场景,因为它主要是针对低延时而设计的编解码器。
PS:VPx编解码器是Google收购ON2公司后开源的,VPx现在是WebM项目的一部分,而WebM项目是Google致力于推动的HTML5标准之一

b.  Video Jitter Buffer
视频抖动缓冲器,可以降低由于视频抖动和视频信息包丢失带来的不良影响。

c.  Image enhancements
图像质量增强模块
对网络摄像头采集到的图像进行处理,包括明暗度检测、颜色增强、降噪处理等功能,用来提升视频质量。

底层架构

上图实为WebRTC的底层架构,可以其用到的技术非常多的,包括视频音频处理以及网络传输,防火墙穿越等技术。


WebRTC有三个模块,Voice Engine(音频引擎),Video Engine(视频引擎),Transport。Voice Engine包含iSAC/iLBC Codec(音频编解码器,前者是针对宽带和超宽带,后者是针对窄带),NetEQ for voice(处理网络抖动和语音包丢失),Echo Canceler(回声消除器),Noise Reduction(噪声抑制);Video Engine包含VP8 Codec(视频图像编解码器),Video jitter buffer(视频抖动缓冲器,处理视频抖动和视频信息包丢失),Image enhancements(图像质量增强)。Transport包含SRTP(安全的实时传输协议,用以音视频流传输),Multiplexing(多路复用),P2P,STUN+TURN+ICE(用于NAT网络和防火墙穿越的)。除此之外,安全传输可能还会用到DTLS(数据报安全传输),用于加密传输和密钥协商。整个WebRTC通信是基于UDP的

MediaStream获取音视频数据流

getUserMedia(constraints,successCallback,errCallback)

navigator上的方法,用于获取用户授权提供的音频视频数据流,三个参数分别为约束对象,成功的回调函数,发送错误的回调函数。

浏览器兼容性

        
        
        
1
2
3
4
        
        
        
const getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);

上栗子:MediaStream和Canvas实现拍照功能

        
        
        
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        
        
        
const getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
let video = document.getElementById( 'video'),
canvas = document.getElementById( 'canvas'),
ctx = canvas.getContext( '2d'),
localStream = null;
getUserMedia({ video: true, audio: true},stream=>{
video.src = window.URL.createObjectURL(stream);
localStream = stream;
},err=>{
console.log( 'get stream failed!');
});
video.addEventListener( 'click',()=>{
if(localStream){
ctx.drawImage(video, 0, 0);
document.getElementById( 'img').src = canvas.toDataURL( 'image/png');
}
});

RTCPeerConnection实现P2P通信

P2P通信基于UDP传输协议,更加注重传输实时性。P2P建立过程是比较复杂的。主要是交换SDP和ICE信息。
P2P

上图所示为利用信令服务器实现P2P通信的流程图,其中还包含了STUN服务器(非WebRTC实现)

P2P通信建立过程

交换SDP

SDP是一种会话描述协议(Session Description Protocol),包含了一系列信息包括会话使用的媒体种类,双方ip和port,带宽,会话属性等。

SDP交换采用Offer/Answer形式。

  1. 首先Offer方通过new RTCPeerConnection(config)建立PeerConnection
  2. Offer方通过createOffer生成sessionDescription,设置localDescription,并通过信令服务器发送给Answer方
  3. Answer方收到offer,发现并没有与之对应的peerConnection,新建peerConnection,并设置remoteDescription
  4. Answer方通过createAnswer生成sessionDescripton,设置localDescription,并通过信令服务器发送answer
  5. Offer方收到answer,设置remoteDescription
  6. SDP交换结束
交换ICE

ICE是一种用于实现NAT/防火墙穿越的协议,可以实现:

  1. P2P直接通信
  2. 使用STUN服务器实现突破NAT的P2P通信
  3. 使用TURN中继服务器实现突破防火墙的中继通信

交换过程:

  1. 双方在new RTCPeerConnection(config)建立连接后,当网络候选者可用时,会触发icecandidate事件
  2. 在onicecandidate事件处理程序中将candidate通过信令服务器发送给对方
  3. 双方在接受到彼此的candidate后,通过addIceCandidate将对方的candidate加入到PeerConnection实例中。

在连接建立前或者建立后调用peerConnection.addStream()方法将本地视频/音频数据流加入到connection当中,当对方接受到视频流时会触发addStream事件,在其处理程序中我们可以接受数据流将其显示。

基于Socket.io和WebRTC的两人视频聊天室

上述过程的信令服务器可以使用WebSocket服务,而Node.js可以方便的实现ws服务,socket.io更是封装了一系列API,可以方便的实现多人视频聊天室,多人视频聊天室有需要注意一些其他诸如SDP冲突问题,这里先以两人通信为例来更深入理解整个过程。

        
        
        
1
        
        
        
//代码较多这里省略

NAT/防火墙穿越技术

之所以将NAT/防火墙单独出来,是因为NAT/防火墙问题是建立端对端通信的一个重要问题
STUN

NAT

NAT将连接到公网的全局ip转换为内网ip,实现多个终端通信,防止受到来自外网的攻击,有效节省IPV4数量。WebRTC必须穿越NAT进行通信。ICE可以通过STUN技术穿越NAT。

NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。目前用得比较多的就是端口多路复用。

STUN服务器可以是自己搭建的,也可以是直接使用现成的,比如谷歌的stun服务:stun:stun.l.google.com:19302

自己搭建STUN服务器比较简单,这里篇幅有限,省略

配置好STUN服务,以此建立RTCPeerConnection,配置方法就是上面的config对象:

        
        
        
1
2
3
4
        
        
        
const config = {
"iceServers":[{ "url": "stun:stun.yourdomain.com:3478"}]
}
let peer = new RTCPeerConnection(config);

防火墙

对于防火墙,需要依靠TURN服务器来进行通信。起一各TURN服务器监听在某个端口时,需要设置防火墙开发这个端口。搭建TURN服务器也比较简单,在这里也省略。

同样也要配置好config:

        
        
        
1
2
3
4
5
        
        
        
const config = {
"iceServers":[
{"url":"stun:stun.yourdomain.com:3478"},{"url":"turn:turn.yourdomain.com:3478","username":"yourid","credential:"yourpassword"}]
}
let peer = new RTCPeerConnection(config);

RTCDataChannel API

既然可以实现音频视频的实时通信,为何不可以实现文本,文件等数据的传输呢?RTCDataChannel API就提供了这个功能。它通过将数据直接从一个浏览器发送到另一个浏览器,不需要将数据通过服务器来进行中转发送,简化了过程,保证实时性,同时还确保数据的安全私密性。

RTCDataChannel 与RTCPeerConnection API相结合,使用SCTP(流控制传输协议)实现稳定有序的数据传递。其仍然需要信令服务器的参与。以及STUN和TURN服务器来穿越NAT/防火墙。

RTCDataChannel支持两种模式运行:不可信赖模式(类似UDP)和可信赖模式(类似于TCP)。

流程分析

  1. 通过config建立RTCPeerConnection
  2. 通过peerConnection.createDataChannel(label,dataChannelConfig)获取dataChannel对象
  3. 按照上述P2P建立流程完成SDP和ICE信息交换
  4. 调用send()方法发送消息
  5. 接收方监听message事件,获取数据
        
        
        
1
        
        
        
let dataChannel = peerConnection.createDataChannel( 'dataChannel',{ 'reliable:false'});

详细API可查看WebRTC官网




4、WebRTC核心模块API


(1)、网络传输模块:libjingle
WebRTC重用了libjingle的一些组件,主要是network和transport组件,关于 libjingle的文档资料可以查看这里

(2)、音频、视频图像处理的主要数据结构
常量\VideoEngine\VoiceEngine

注意:以下所有的方法、类、结构体、枚举常量等都在webrtc命名空间里   

类、结构体、枚举常量

头文件

说明

Structures

common_types.h

Lists the structures common to the VoiceEngine & VideoEngine

Enumerators

common_types.h

List the enumerators common to the  VoiceEngine & VideoEngine

Classes

common_types.h

List the classes common to VoiceEngine & VideoEngine

class VoiceEngine

voe_base.h

How to allocate and release resources for the VoiceEngine using factory methods in the VoiceEngine class. It also lists the APIs which are required to enable file tracing and/or traces as callback messages

class VideoEngine

vie_base.h

How to allocate and release resources for the VideoEngine using factory methods in the VideoEngine class. It also lists the APIs which are required to enable file tracing and/or traces as callback messages


(3)、音频引擎(VoiceEngine)模块 APIs

下表列的是目前在 VoiceEngine中可用的sub APIs
sub-API

头文件

说明

VoEAudioProcessing

voe_audio_processing.h

Adds support for Noise Suppression (NS), Automatic Gain Control (AGC) and Echo Control (EC). Receiving side VAD is also included.

VoEBase

voe_base.h

Enables full duplex VoIP using G.711.
NOTE: This API must always be created.

VoECallReport

voe_call_report.h

Adds support for call reports which contains number of dead-or-alive detections, RTT measurements, and Echo metrics.

VoECodec

voe_codec.h

Adds non-default codecs (e.g. iLBC, iSAC, G.722 etc.), Voice Activity Detection (VAD) support.

VoEDTMF

voe_dtmf.h

Adds telephone event transmission, DTMF tone generation and telephone event detection. (Telephone events include DTMF.)

VoEEncryption

  • 1
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WebRTC(Web实时通信)是一个开源项目,用于实现浏览器之间的实时通信。它提供了一系列的API,可以在Web浏览器中实现音频、视频和数据的共享。我们可以通过CSDN网站找到WebRTC的源代码。 在CSDN网站上,可以通过搜索引擎或直接访问相关的代码仓库,例如GitHub,来获取WebRTC的源代码。在代码仓库中,我们可以找到所有的源代码文件和相关的文档,以便我们深入了解和研究WebRTC的实现。 WebRTC的源代码主要由C++和JavaScript编写。C++部分包含了底层音视频处理的功能,例如编码和解码、网络传输和流媒体处理等。JavaScript部分则负责在浏览器中调用和使用WebRTC的API,并处理与用户界面的交互。 WebRTC的源代码非常庞大且涉及复杂的技术,包括音视频编解码、网络传输、数据通信等。因此,理解和使用WebRTC的源代码需要具备一定的编程和网络知识。 通过研究WebRTC的源代码,我们可以深入了解实时通信技术的内部机制,并根据实际需求进行定制和优化。同时,我们也可以利用WebRTC的源代码作为学习和参考,开发自己的实时通信应用程序。 总之,通过在CSDN上获取WebRTC的源代码,我们可以深入了解WebRTC的实现,并利用它构建强大的实时通信应用程序。但是,请注意,理解和使用WebRTC的源代码需要一定的学习和实践。 ### 回答2: WebRTC是一个开源项目,用于实现浏览器之间的实时音视频通信。该项目的源码可以在GitHub上找到,并且在CSDN社区也有相关的文章和教程。 在CSDN上搜索"Webrtc源码"可以找到很多相关的资源。这些资源包括了Webrtc的基本概念解释、架构设计、源码解析以及开发应用的示例等内容。通过阅读这些文章,可以了解Webrtc的整体架构、通信流程以及关键模块的工作原理。 在学习Webrtc源码的过程中,建议先理解WebRTC的基本概念和术语,如信令服务器、ICE协议、SDP等。然后,可以重点关注核心模块,如音视频采集、媒体传输、音视频编解码等。此外,还可以深入研究网络传输协议、媒体处理等相关技术。 CSDN上的相关文章和教程能够提供对Webrtc的源码解析和开发指导,同时也是讨论和交流的平台。在学习过程中,可以参考这些文章,并结合源码进行实际的操作和实践。 总而言之,Webrtc源码可以通过CSDN找到相关资源,并通过阅读相应的文章和教程对源码进行理解和学习,借助这些资源和社区的支持,我们可以更好地掌握Webrtc的实现原理和开发应用。 ### 回答3: WebRTC(Web实时通信)是一个开放源代码项目,旨在提供实时音视频通信的能力。关于WebRTC的源码,可以在CSDN等技术社区找到相关资源。 在CSDN上,可以找到很多关于WebRTC源码的学习资料和教程。首先,可以通过搜索关键词“WebRTC源码”来获取一些源码解析文章,这些文章会帮助我们深入了解WebRTC的实现原理和基本架构。 此外,CSDN上也有一些专门讨论WebRTC的论坛和社区,这些社区中的会员可以分享彼此的学习经验、提供问题解答等。在这些社区中,我们可以找到许多WebRTC开发者和爱好者,他们可以提供有关源码的深入分析和讨论。 在CSDN还可以找到一些WebRTC相关的开源项目,例如一些基于WebRTC的音频、视频通信的实现。这些开源项目往往提供了完整的源代码和文档,可以作为参考和学习的资料。 总之,CSDN是一个很好的资源平台,提供了关于WebRTC源码的丰富信息。通过CSDN,我们可以找到相关的源码解析文章、讨论社区和开源项目,这些资源都能帮助我们更好地理解和学习WebRTC的源码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值