基于 WebRTC 技术的实时通信服务开发实践
WebRTC 的前世今生
什么是 WebRTC
2010年5月,Google 花费6820万美元收购拥有编解码、回声消除等技术的 GIPS 公司。之后谷歌开源了 GIPS 的技术,与相关机构 IETF 和 W3C 制定行业标准,组成了现有的 WebRTC 项目。
WebRTC 全称 Web Real-Time Communication。它并不是单一的协议, 包含了媒体、加密、传输层等在内的多个协议标准以及一套基于 JavaScript 的 API。通过简单易用的 JavaScript API ,在不安装任何插件的情况下,让浏览器拥有了 P2P音视频和数据分享的能力。
同时WebRTC 并不是一个孤立的协议,它拥有灵活的信令,可以便捷的对接现有的SIP 和电话网络的系统。
WebRTC 具有的优势
成立UPRTC项目前,又拍云经过多重调研和考虑,选择了 WebRTC,主要有三个原因:
1. WebRTC 是开源、 免专利费的项目, 大大节省了开发时间和成本;
2. WebRTC 由 Google 主导, 技术非常先进;
3. Safari 等浏览器以及其他终端逐渐加强对 WebRTC 技术的支持。
WebRTC 的核心组件
- 音视频引擎:OPUS、VP8 / VP9、H264
- 传输层协议:底层传输协议为 UDP
- 媒体协议:SRTP / SRTCP
- 数据协议:DTLS / SCTP
- P2P 内网穿透:STUN / TURN / ICE / Trickle ICE
- 信令与 SDP 协商:HTTP / WebSocket / SIP、 Offer Answer 模型
图1为 WebRTC 内部结构简化图,最底层是硬件设备,上面是音频捕获模块和视频捕获模块。
中间部分为音视频引擎。音频引擎负责音频采集和传输,具有降噪、回声消除等功能。视频引擎负责网络抖动优化,互联网传输编解码优化。
在音视频引擎之上是 一套 C++ API,在 C++ 的 API 之上是提供给浏览器的Javascript API。
△ 图1:WebRTC内部结构
图2是 WebRTC 涉及到的协议栈,WebRTC 核心的协议都是在右侧基于 UDP 基础上搭建起来的。
其中,ICE、STUN、TURN 用于内网穿透, 解决了获取与绑定外网映射地址,以及 keep alive 机制。
DTLS 用于对传输内容进行加密,可以看做是 UDP 版的 TLS。由于 WebRTC 对安全比较重视,这一层是必须的。
SRTP 与 SRTCP 是对媒体数据的封装与传输控制协议。
SCTP 是流控制传输协议,提供类似 TCP 的特性,SCTP 可以基于 UDP 上构建,在 WebRTC 里是在 DTLS 协议之上。
RTCPeerConnection 用来建立和维护端到端连接,并提供高效的音视频流传输。
RTCDataChannel 用来支持端到端的任意二进制数据传输。
△ 图2:WebRTC 协议栈
基于 WebRTC 的 UPRTC
为了使 WebRTC 协议更适用于实时互动直播,又拍云在 WebRTC 协议的基础上进行改造优化,搭建了又拍云 UPRTC 。支持多种应用场景,包括一对一、一对多和多对多等应用场景。
- 传统的 WebRTC 应用模式是 P2P 的, UPRTC 则是服务器中转模式。
因为又拍云拥有性能优异的 CDN 资源,将 WebRTC 改造成服务器中转模式之后,采用完全分布式系统,部署到全国所有边缘节点,通过内部加速网络 UTUN 加速,将转发、并发压力转移到服务端,保证 UPRTC 终端可以承受更多路并发。
- 加入网络拥塞自适应控制,较强的弱网适应能力。
以移动设备从 WIFI 网络切换到 4G 网络为例,又拍云服务器可以察觉到带宽变化,统计丢包和延时,进行动态码率调整,保证在弱网环境下也能进行正常通话。
- 对底层开源组件优化改造,支持高并发业务场景。
又拍云设计了一套灵活高效的业务信令,用于敏感信令鉴权。
图3为 UPRTC 技术组成:
- 媒体通道、数据通道,信令通道;
- 数据加密模块;
- 码率自适应控制模块;
- 又拍云加速网络;
- P2P打洞服务;
- 房间应用业务;
- 机器人(自动管理功能和互动功能)。
△ 图3:UPRTC技术组成
总结
虽然 WebRTC 源代码相对成熟,但是在实际应用中依旧需要解决以下问题:
1.音频处理过程中消耗 CPU 过高;
2.音视频不同步的BUG;
3.安卓端 WebRTC 源码对H.264支持并不全面,仅默认支持高通的芯片;
4.服务端架构过程中需要加入码率自适应算法,动态控制总码率带宽在 2M 以内。
推荐参考文档:
W3C API 相关文档: https://github.com/w3c
IETF 协议相关文档: https://datatracker.ietf.org
相关阅读:
基于 WebRTC 技术的实时通信服务开发实践的更多相关文章
- 基于webrtc技术session border controler (SBC)
由于原来的文章 http://blog.csdn.net/voipmaker 转载注明出处. 我建了一个通信学习 交流群. 45211986, 欢迎增加. WebRTC技术致力于在浏览器端实现实时音 ...
- 基于webRTC技术 音频和视频,IM解
由于原来的文章 http://blog.csdn.net/voipmaker 转载注明出处. 基于WebRTC技术可实现点对点音视频.即时通信.视频会议.最新的系统组件包含: TeleICE NAT ...
- 基于 Spring Cloud 的微服务架构实践指南(下)
show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...
- 基于React Native的58 APP开发实践
React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势.再加上Native的优秀性能,让越来越多的公司 ...
- 倒计时2日!基于 Apache DolphinScheduler&TiDB 的交叉开发实践,从编写到调度让你大幅提升效率
当大数据挖掘成为企业赖以生存.发展乃至转型的生命,如何找到一款好软件帮助企业满足需求,成为了许多大数据工程师困扰的问题.但在当下高速发展的大数据领域,光是一款好软件似乎都不足以满足所有场景业务需求,许 ...
- 基于 Spring Cloud 的微服务架构实践指南(上)
show me the code and talk to me,做的出来更要说的明白 GitHub 项目learnSpringCloud同步收录 我是布尔bl,你的支持是我分享的动力! 一. 引入 上 ...
- 基于.net技术的 Rss 订阅开发
RSS(Really Simple Syndication,真正简单的连锁)是一种 Web 内容连锁格式.RSS 成为通过 Web 连锁新闻内容的标准格式.刚好我现在vs的环境也是.net,因为在.N ...
- 基于 Docker 的微服务架构实践
本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...
随机推荐
- C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)
本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...
- XtraBackup物理备份 阿里云的Mysql备份方案
XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBac ...
- [BZOJ1597]土地购买
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- response.getWriter().write()产生乱码
Struts1中通过action, return到页面的时候,如果代码中使用到response.getWriter().write(),那么有可能jsp页面中汉字会变成乱码.百度上有人说改为respo ...
- EntityFramework Core迁移时出现数据库已存在对象问题解决方案
前言 刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容. EntityFramework Core迁移出现对象在数据库中已存 ...
- XML配置文件中写版本号.xsd和不写版本号的区别
如果写版本号则默认从网上下载并指定最新版本,如果不写版本号则默认从本地下载并使用最新版本.
- v9 调用模型中新增的字段
在模型中新增字段的时候,可以选择“是否为主表”. 若选是,则前台调用可直接通过字段名调用. 若选否,在前台调用是应在{pc:content}中添加 moreinfo="1",表示允 ...
- js传宗接代---继承
前几天重温了一下js的继承,今天分享给大家: 一,类式继承. 所谓的类式继承就是:第二个类的原型prototype被赋予了第一个类的实例,如subcals.prototype=new supercls ...
- 为Windows资源管理器右键菜单添加菜单项
为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...
- JS面向对象笔记二
菜单导航,<JS面向对象笔记一>, 参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...