WebRTC通信流程

WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频对聊功能。而且WebRTC项目是开源的,我们可以借助WebRTC源码快速构建自己的音视频对聊功能。无论是使用前端JS的WebRTC API接口,还是在WebRTC源码上构建自己的对聊框架,都需要遵循以下执行流程:

上述序列中,WebRTC并不提供Stun服务器和Signal服务器,服务器端需要自己实现。Stun服务器可以用google提供的实现stun协议的测试服务器(stun:stun.l.google.com:19302),Signal服务器则完全需要自己实现了,它需要在ClientA和ClientB之间传送彼此的SDP信息和candidate信息,ClientA和ClientB通过这些信息建立P2P连接来传送音视频数据。由于网络环境的复杂性,并不是所有的客户端之间都能够建立P2P连接,这种情况下就需要有个relay服务器做音视频数据的中转,本文本着源码剖析的态度,这种情况就不考虑了。这里说明一下, stun/turn、relay服务器的实现在WebRTC源码中都有示例,真是个名副其实的大宝库。

上述序列中,标注的场景是ClientA向ClientB发起对聊请求,调用描述如下:

  • ClientA首先创建PeerConnection对象,然后打开本地音视频设备,将音视频数据封装成MediaStream添加到PeerConnection中。
  • ClientA调用PeerConnection的CreateOffer方法创建一个用于offer的SDP对象,SDP对象中保存当前音视频的相关参数。ClientA通过PeerConnection的SetLocalDescription方法将该SDP对象保存起来,并通过Signal服务器发送给ClientB。
  • ClientB接收到ClientA发送过的offer SDP对象,通过PeerConnection的SetRemoteDescription方法将其保存起来,并调用PeerConnection的CreateAnswer方法创建一个应答的SDP对象,通过PeerConnection的SetLocalDescription的方法保存该应答SDP对象并将它通过Signal服务器发送给ClientA。
  • ClientA接收到ClientB发送过来的应答SDP对象,将其通过PeerConnection的SetRemoteDescription方法保存起来。
  • 在SDP信息的offer/answer流程中,ClientA和ClientB已经根据SDP信息创建好相应的音频Channel和视频Channel并开启Candidate数据的收集,Candidate数据可以简单地理解成Client端的IP地址信息(本地IP地址、公网IP地址、Relay服务端分配的地址)。
  • 当ClientA收集到Candidate信息后,PeerConnection会通过OnIceCandidate接口给ClientA发送通知,ClientA将收到的Candidate信息通过Signal服务器发送给ClientB,ClientB通过PeerConnection的AddIceCandidate方法保存起来。同样的操作ClientB对ClientA再来一次。
  • 这样ClientA和ClientB就已经建立了音视频传输的P2P通道,ClientB接收到ClientA传送过来的音视频流,会通过PeerConnection的OnAddStream回调接口返回一个标识ClientA端音视频流的MediaStream对象,在ClientB端渲染出来即可。同样操作也适应ClientB到ClientA的音视频流的传输。

转自:http://www.cnblogs.com/fangkm/p/4364553.html

时间: 2024-11-05 18:57:46

WebRTC通信流程的相关文章

Socket通信流程

Socket通信流程 HTTP 底层就是通过socket建立连接通信管道,实现数据传输 HTTP是一个TCP的传输协议(方式),它是一个可靠,安全的协议

Linux - 面向连接的socket通信流程

字符串的IP与32的IP的转换 说明 网络上的IP都是数字加点(192.168.0.1)构成 struct in_addr结构使用32位的IP,如 IP(C0A80001)是192.168.0.1 函数原型 int inet_aton(const char *cp, struct in_addr *inp) 将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面 char *inet_ntoa(struct in_addr in) 将32位IP转换为a.b.c.d的格式 说明 a代表

个人理解的 Https 通信流程

https 简单理解是 http + ssl 安全协议. http 协议的问题是,数据在传递的过程中,会经过很多路由,网关等,可能会被恶意的路由器进行数据拦截,篡改等. https 的通信流程:1.首先确定服务器是经过安全机构认证的,是可信任的.2.通信过程是经过加密的. 1.a. 首先公司向认证机构,申请证书,认证机构根据公司的信息等,生成 子证书,然后把 (子证书, (子证书通过HASH算法,进行安全哈希,生成消息摘要,用私钥加密生成的)数字签名, 公钥,私钥)给公司. 1.b. 客户端向服

深度剖析MQTT协议的整个通信流程

http://www.elecfans.com/d/587483.html MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对MQTT的很少,尤其是在如何移植到嵌入式上来.大部分的平台商的做法都是跟模块商合作把MQTT协议集成到WiFi模块跟GPRS模块里面,捆绑一销售,不让用户过多的了解物联网最核心的东西. 在还没有深入去了解MQTT协议之前,总

什么是 socket?简述基于 tcp 协议的套接字通信流程?

Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计算机之间的通信. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 基于tcp 协议的套接字通信流程: 1). 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听. 2). 用 bind

Winsock系列函数 及 Socket通信流程

Socket是一种网络通信机制 Winsock系列函数 1. Socket 创建socket 2. Connect 尝试连接远端Socket 3. Send 在某个Socket 向远端发送数据 4. Recv 接收远端数据 5. Closesocket 关闭连接 6. Listen 在某个Socket上建立监听 7. Accept 接收一条新的连接 (是接收连接而不是接收数据) 8. Bind 给一个Socket分配一个本地协议地址 9. Select 用于检测Socket状态,用于高级通信 1

cc2530串口通信流程

//串口发送接收流程 main: //主函数 ->osal_init_system(); //操作系统初始化 ->osalInitTasks(); //任务初始化 -->ZDApp_Init(taskID++); //该函数初始化后,协调器建立网络.终端将加入网络 -->ZDOInitDevice(0); //设备初始化 -->ZDAPP_NetworkInit(extendedDelay); //网络初始化 -->osal_start_timeEx(....,ZDO_

移动端与服务端通信流程设计

转自:http://blog.snsgou.com/post-766.html 针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录才能访问: 4.有点接口不需要用户登录就可访问: 针对以上特点,移动端与服务端的通信就需要2把钥匙,即2个token. 第一个token是针对接口的(api_token

请教一个问题:关于 webrtc 通信的问题

在下是webrtc开发新手,目前遇到了个问题,翻来翻去一直没弄明白.可能英文不佳,看文档看蒙了,所以一直没找到解决方法. 开发环境: node.js 搭建的服务器 目前是用socket.io做通信 开发目的: A同学向B同学发起请求,B同学收到后双方互相视频直播. 如果有清楚的同学麻烦告知我哈,真的麻烦大家了 O(∩_∩)O~~ 问题描述: 目前在搭建两人视频的demo,但是在双方信号交换信息上出问题了.控制台打印出来是这样的: 代码如下: 1 var servers = null; 2 3 f