实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅。这牵涉到主要三大块技术点:
- 网络端、服务端的开发和传输算法
- WebRTC 协议中牵扯到服务端的应用协议和信令服务
- 客户端iOS、安卓 H.264 编解码技术
△ WebRTC 技术点
实时音视频互动必须遵守三大点
- 必须基于 UDP 协议,否则不要谈实时
因为 TCP 协议的重传机制(传输保障)会导致累积延迟问题,用 UDP 协议没有传输保障机制,但需要自行完善丢包容错逻辑。
又拍云音视频互动方案是基于UDP 协议,使用 TCP 协议无法保障实时性。
TCP 协议有包重传机制,保证传输内容100%传输到目的地,这个特性导致延时增加。当然,由于UDP协议没有包重传机制,需要完善业务的容错性。目前来说,UTUN 网络提供的两种配置,都可以保证数据100%传输。
在极差的网络状态下,可以选择容忍丢包,使用算法保障90%以上的数据包正常到达,以此达到200ms以内延迟。
UDP协议相比TCP协议具有多链路传输的优势。
TCP协议只支持单一链路传输。当连麦、音画同时需要传输时,TCP协议只有一条通道进行数据传输。而通过UDP协议,音视频可以通过两个节点将数据一分为二来传输,A路传输50%数据包,B路传输50%数据包。终端收到两路数据流,再合并放到应用层做解码处理。
- 考虑多终端适配,使用 WebRTC 协议
客户端网络跨地区和跨运营商信号很差,所以不能使用 P2P 模式。目前包括苹果Safari 在内的所有的桌面端浏览器都已支持 WebRTC 协议。
网络层使用 P2P 模式无法解决跨地域、跨 ISP 的跨运营商网络问题,会导致延时过高的情况产生。如果一直纠结于P2P模式,那么QOS码率控制、包容忍等问题就无法在算法上有所突破。
- 云服务化
单机、单机房存在硬件瓶颈,唯有云服务化才能按需做到横向扩展。
随着用户量的提升,单台服务器所能支撑的并发量直播有限,RTMP Server、WebRTC Server一般八核服务器能承受的并发量只有2000~4000路,单机房也会成为硬件瓶颈,而公有云能承受几十万甚至上百万的数量压力,所以机房中不能存在单点,必须是云服务化分布式的。
云服务化非常重要,上文提到的 UTUN 网络属于完全分布式网络,分布在又拍云两百多个节点,四千台服务器上。只需要接入又拍云任意边缘服务器,就可以做到自主服务,自动选择出一条甚至数条路径,让用户与通讯网中任何地点的人交互。
又拍云 WebRTC 架构中遇到的经验和问题
又拍云 WebRTC 相比外部的 WebRTC 有较大的差别。即使你在同一个地方、同一个服务商、同一个无线信号下,又拍云都没有使用P2P模式,都是通过云服务来进行网络传输的。
我们严格遵循官方标准搭建包括服务端、客户端在内的 WebRTC 体系。目前 WebRTC 版本为可变性非常大的1.0版本,未来该技术可能会有革命性的迭代。如果采用自研的方式,会有无法跟进版本技术更新的风险。再者如果完全自主编写 Server 端或者客户端势必要投入非常大的精力和研发时间。
因此又拍云选择紧跟官方的步伐,无论官方有何种bug修复,都选择同步更新。
又拍云在实践中遇到的问题:
- 当 iOS 端使用新版本 WebRTC 时,由于音频处理部分导致的 Bug,会导致 CPU 占用率过高;
- 服务 Server 端由于编码传输时 WebRTC 是可变码率、可变帧率的,但是内核代码在进行传输时却使用了固定帧率操作,时间戳不一致的 Bug 导致了音视频不同步的情况,声音与画面不同步最大延时可以达到数十秒,不断累积。为了解决这个 Bug 需要把视频时间戳进行修正,统一使用音频的时间戳,来保证音视频同步;
- Android 端不支持高通外的芯片硬解码,又拍云在近期把各个 Android 端编解码功能完善,目前已经能够适配华为、MTK、三星等品牌的机型;
- 目前客户端解码能力有限,会话人数最好控制在8个人以内;
- 自动根据参与人数控制总带宽在2Mbps以内;
- 美颜、滤镜等功能的接入会增加延迟,加入额外功能不能过度消耗客户端 CPU 资源。
音视频互动最大的难点——业务信令
目前业务信令还没有一套完整的解决方法,业务信令在 WebRTC 中虽然是开源的,但是没有形成标准的信令协议,这个部分需要我们自行构建。
架构网络电话场景时,牵扯到三个信令:呼叫、等待接听、通话。
但是实际中会有更多信令,假设一个会议场景,A邀请参会B,A会设置多个邀请途径:1.A直接将B拉到会议室;2.A把会议室号码给B,B自行进入;3.A配置房间权限控制,需要得到授权才能进入房间等。随着业务的发展,业务信令会不断增加,我们需要构建一套完善的信令体系显得非常重要。
我们在编写信令系统时,把信令系统分成了两类:1.底层系统信令,2.公共业务信令。
底层系统信令只需编写公共业务信令的总通道协议和 API 接口,让应用程序对接,将业务信令进行统一标准化。比如在房间里,发送一条广播给所有参会者的业务信令S,而业务信令S只想传达给B,但是C在同一个会议室也听到了,C会选择性的对业务信令S忽略以此达成这个业务功能。
目前来说必须面临的现实问题:
1.客户端硬件性能未能支持高清码率:多人互动不可能做到720P分辨率,一般来说都是在320P或者460P分辨率。一般手机因为客户端的解码能力支撑不了多路高清解码,达到6路以上码率只能做到300K以下;
2.硬编解码兼容性差:Android 机型太多,仅能有限支持H.264硬编解码,同时iOS和Android 端均不支持 H.265 硬编解码;
3.手机发热、耗电量大:参加会议iPhone电量支撑两、三个小时。桌面端耗电、发热最严重,测试时使用Chrome硬解码电量只能支持两个小时。
以上三点是目前整个业内所都要面临的最大的问题,只能等待终端的解码能力提升,相信到明年手机解码能力就可以支持多路高清互联。
相关阅读:
实时音视频互动系列(下):基于 WebRTC 技术的实战解析的更多相关文章
- 实时音视频互动系列(上):又拍云UTUN网络详解
如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...
- 基于 WebRTC 技术的实时通信服务开发实践
随着直播的发展,直播实时互动性变得日益重要.又拍云在 WebRTC 的基础上,凭借多年的开发经验,结合当下实际情况,开发 UPRTC 系统,解决了网络延时.并发量大.客户端解码能力差等问题. WebR ...
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...
- 腾讯互动白板+即时通讯+实时音视频,Android学生端接入
腾讯互动白板+即时通讯+实时音视频,Android学生端接入 一.简介 线上教学方案:腾讯云互动白板(Tencent Interactive Whiteboard,TIW)+即时通信(Instant ...
- iOS WebRTC 点对点实时音视频流程介绍
前言 公司某个项目需要接入音视频即时通讯, 功能类似微信的拨打视频通话,语音通话的场景.那么对于音视频通讯会用到什么技术呢?没错,它就是 WebRTC . 什么是WebRTC WebRTC,名称源自网 ...
- 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧
zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...
- BBR在实时音视频领域的应用
小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...
- 融云携新版实时音视频亮相 LiveVideoStack 2019
4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...
- 微信小程序+腾讯云直播的实时音视频实战笔记
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- vue使用Axios做ajax请求
vue2.0之后,就不再对vue-resource更新,而是推荐使用axios 1. 安装 axios $ npm install axios 或 $ bower install axios 2. 在 ...
- sql 经典面试题
如果数据库里两个日期型字段d1,d2,怎样用sql语句列出按月的所有区间,比如表结构如下localid d1 d21 2014-1-15 2014-3- ...
- cpp(第七章)
1.c++提供了3种表示c—风格字符串方法:字符数组,字符串常量,字符串指针.其中字符数组并不一定是字符串,以空值字符'\0'来结束的字符数组时字符串. 2.函数参数为数组时,虽然减少了时间和内存的使 ...
- Eclipse汉化后如何还原为EN英文(实用技巧) --转
自从那天脑袋短路后,下了个汉化包将Eclipse给汉化了,用的我真TMD的不习惯,一直想还原为EN文,试了好多办法,删文件,汉化包,改eclipse.ini文件中的"-nl zh" ...
- 关于并发,关于IIS你真的了解吗?(一)
本文仅代表带个人观点及理解,本人只是一个编程小菜鸟,如果有不对的地方.请大佬轻喷! 前言:对于很多工作时间短或者编程经验不足的程序员来说,大多数会觉得并发这个词离自己太遥远,之所以知道并发也不过是因为 ...
- Swift json字典转模型 项目记录
背景 最近项目开始转用Swift3开发,由于Swift中json(字典)转模型的选择方案较多,笔者最开始选择了HandyJSON的方案,在使用一段时间后发现当要进行某个字段取值使用时需要进行各种的转化 ...
- ecshop加入购物车效果(各个页面)
ecshop中点击加入购物车出现下图 通过以下代码改成下图效果 1.后台网店设置 购物车确定提示 选择为“提示用户,点击“确定”进购物车” 2.打开js/common.js 104行就是funct ...
- JavaScript面向对象轻松入门之继承(demo by ES5、ES6)
继承是面向对象很重要的一个概念,分为接口继承和实现继承,接口继承即为继承某个对象的方法,实现继承即为继承某个对象的属性.JavvaScript通过原型链来实现接口继承.call()或apply()来实 ...
- 架构漫谈系列(2) 封装(Encapsulation)
这是这个系列的第二篇.在第二篇里,我决定讲一讲封装. 程序的不同部分应该用封装去互相隔离,模块之间应该不应该产生很随意的关联. 可能有的人觉得不解,又或觉得是有道理的废话,不急,先一步一步来. 我们先 ...
- 设置Ubuntu下adb 及 fastboot权限
以普通用户登录linux,然后运行adb devices会提示权限不够: List of devices attached ???????????? no permissions 这是因为 ...