作者: 博客园        - 孤竹君

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

转载于:https://www.cnblogs.com/onlycoder/p/7297356.html

WebRTC手记之初探相关推荐

  1. (五)WebRTC手记Channel概念

    转自:http://www.cnblogs.com/fangkm/p/4401075.html 前面两篇博文完整地介绍了WebRTC音视频的采集模块,接下来应该开始介绍关键的音视频编码模块.不过在介绍 ...

  2. (六)WebRTC手记之WebRtcVideoEngine2模块

    转自:http://www.cnblogs.com/fangkm/p/4401143.html 终于讲到视频数据的编码发送模块了,不容易.总体来说也看了不少时间WebRTC的源码了,最大的感触就是各个 ...

  3. WebRTC手记之本地视频采集

    转载请注明出处:http://www.cnblogs.com/fangkm/p/4374610.html 前面两篇文章介绍WebRTC的运行流程和使用框架接口,接下来就开始分析本地音视频的采集流程.由 ...

  4. freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。

    本文主要记录freeswitch学习过程. 一 安装freeswitch NOTE 以下两种安装方式,再安装的过程中遇到了不少问题,印象比较深刻的就是lua库找到不到这个问题.这个问题发生在make ...

  5. ci github 通知_初探CI,Github调戏Action手记——自动构建并发布

    前言 最近在做脚本的说明文档时使用了vuepress这个东西 前端实在是菜,只能随便写写了 正常写完md文件之后推送至github做版本控制 而前端页面的生成则是在本地,部署也是在本地手工进行 一套下 ...

  6. 基于WebRTC的互动直播实践

    互动直播已经逐渐成为直播的主要形式.映客直播资深音视频工程师叶峰峰在LiveVideoStackCon 2018大会的演讲中详细介绍了INKE自研连麦整体设计思路.如何基于WebRTC搭建互动直播SD ...

  7. 通过这次源码分析直播了解到在中国真正关心源码的webrtc开发者只有1%

    通过这次源码分析直播了解到在中国真正关心源码的webrtc开发者只有1% 昨天晚上花费了2个多小时发给2000多个webrtc各个群里的朋友,截至到现在加入群观看的只有20多个,实际从头听到尾的只有1 ...

  8. 初探Electron,从入门到实践

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在开始之前,我想您一定会有这样的困惑:标题里的Electron 是什么?Electron能做什么?许多伟大的 ...

  9. Electron 初探

    本期 Chat,由葡萄城资深工程师 -- 刘涛,带来<Electron 初探>,届时我们将通过线上直播,讲解 Electron 入门技巧及使用场景. 讲师简介:GrapeCity Spre ...

最新文章

  1. 项目性能优化(页面静态化2)
  2. socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空
  3. RSGAN:对抗模型中的“图灵测试”思想
  4. 关于C10K、异步回调、协程、同步阻塞
  5. html搜索框美化代码单词,CSS 漂亮搜索框美化代码
  6. 你对webpack了解多少?
  7. mysql数据库的目录_了解MySQl数据库目录
  8. Python练习-迭代器-模拟cat|grep文件
  9. 【测试】接口测试介绍
  10. 面向对象【day07】:新式类和经典类(八)
  11. mycat-sublun数据库分片
  12. Python敏感词过滤DFA算法+免费附带敏感词库
  13. 论文笔记——分布式深度学习框架下基于性能感知的DBS—SGD算法
  14. 工程总承包(EPC)最高投标限价政策解说
  15. python实现简单的词形统计
  16. PPT打开密码,如何解密?
  17. 桌面上计算机图标移动变成复制,电脑桌面图标都变成lnk后缀怎么办
  18. prometheus alertmanager告警pending
  19. 阅读真题 | 真题阅读 做题记录 一
  20. ERDAS IMAGINE 9.2进行遥感影像融合

热门文章

  1. FileProvider 在 Android N 上的应用
  2. 进击的Android Hook 注入术《五》
  3. ad中那个快捷键是重复上一部_十大快捷键:让PPT制作效率飞起!(附下载)
  4. docker mysql 不稳定_docker 的 mysql 容器运行一段时间后崩溃
  5. python运算符的分类_python对象——标准类型运算符
  6. python网络通信的几种方式_python网络-计算机网络基础(23)
  7. 图像数据流识别圆形_人工智能大赛视觉处理(一)图形识别
  8. BZOJ-2705-Longge的游戏-SDOI2012-欧拉函数
  9. CVPR 2021 《Causal Attention for Vision-Language Tasks》论文笔记
  10. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)