google的开源项目WebRTC音视频通讯,为什么大家都在使用

WebRTC虽然冠以“web”之名,但并不受限于传统互联网应用或浏览器的终端运行环境。实际上无论终端运行环境是浏览器、桌面应用、移动设备(Android或iOS)还是IoT设备,只要IP连接可到达且符合WebRTC规范就可以互通。这一点释放了大量智能终端(或运行在智能终端上的app)的实时通信能力,打开了许多对于实时交互性要求较高的应用场景的想象空间,譬如在线教育、视频会议、视频社交、远程协助、远程操控等等都是其合适的应用领域。

既然是一种标准规范,那么无论具体实现方式如何,只要该实现符合该标准规范就应该可以互联互通、拥有实时通信的能力,这也是WebRTC最本质的意义。  WebRTC虽然冠以“web”之名,但并不受限于传统互联网应用或浏览器的终端运行环境。实际上无论终端运行环境是浏览器、桌面应用、移动设备(Android或iOS)还是IoT设备,只要IP连接可到达且符合WebRTC规范就可以互通。这一点释放了大量智能终端(或运行在智能终端上的app)的实时通信能力,打开了许多对于实时交互性要求较高的应用场景的想象空间,譬如在线教育、视频会议、视频社交、远程协助、远程操控等等都是其合适的应用领域。  

WebRTC有什么优势和不足?  很长时间以来,实时通信能力一直是电信类专用设备(如电话、手机)的专有属性。随着各种互联网应用和移动互联网应用的层出不穷,特别是随着用户接入带宽条件的不断改善,许多新的应用都对实时通信服务有着切实的需求,希望能够把实时通信能力集成到应用程序中。其实很多终端设备都具有实时通信的潜力的,但是在WebRTC之前,没有一个统一的工业标准来描述一个设备的实时通信能力和连接建立过程。在对实时通信能力的需求特别迫切的应用(如微信、WhasApp、FaceTime、Messenger等等)中,大家各做一套,“七国八制”,完全不能互通。

 WebRTC最大的优势就是“标准化”,它解决的问题就是给所有需要进行实时通信的终端提供一套统一的、开放的实时通信能力描述和连接建立标准。只要符合WebRTC的规范,通信终端的形态和运行环境就是透明的(看不见也不关心),大家都可以用同一种“语言”进行“交谈”。WebRTC对音视频的编码格式(codec)、传输方式和协商过程做出了明确的规定,原则上所有支持WebRTC的终端,在互操作性上将不存在障碍。目前各大浏览器厂商都积极参与到WebRTC技术的生态中,从web应用开始,WebRTC将成为基于网页的音视频实时通信技术规范将。

之后,在web应用于移动终端应用的交互需求驱动下,越来越多的移动应用的音视频服务也将采用WebRTC的技术规范。  要说不足之处,一个就是目前WebRTC标准刚刚尘埃落定,在2018年以及今后的一段时间内,还存在各家浏览器厂商的现有WebRTC实现与规范不完全相符的情况,会多少存在某些应用场景下互联互通的问题,亟待各家浏览器厂商将持续完善现有实现以向标准看齐。另一个很大的不足(遗憾)可能是Android和iOS系统原生支持WebRTC标准的愿景目前还不明确,需要通过在app中集成客户端SDK来实现。

不过向来技术标准的发展和与工业界的应用普及是相互激励的,我们也可以说这是WebRTC标准发展的一个巨大空间。  作为终端技术规范,虽然WebRTC只是实时通信解决方案中的一部分,但是是最贴近用户的一部分,也许也是最重要的一部分。终端技术规范的标准化,是一个很好的开始。连一向以封闭的技术生态闻名的Apple都拥抱WebRTC了,将促进WebRTC技术的发展和普及,会有越来越多的互联网(和移动互联网)应用基于WebRTC构建其实时通信服务。  

进入2018年,在互联网快速发展的当下和将来,WebRTC将极大激活人与人、人与物、物与物(IoT)之间的信息纽带,移除掉通信终端之间的时间(实时)和空间(基于互联网)的障碍,成为应用场景创新的一道强大的技术保障。同时,类似VR、AR、自动驾驶等新的应用场景的出现也会给WebRTC技术带来新的需求和动力,应用场景的商业化成功也将给技术发展持续注入活力和物质资源。譬如近年来直播连麦、网上课堂、远程控制(抓娃娃机)等基于互联网的视频应用的猛烈发展和火热,一次次催动着基于互联网的的实时音视频通信技术的发展,呼唤着WebRTC这样的统一、开放、透明的标准规范成熟和落地。  

想象一下,在基于WebRTC构建的世界里,所有通信终端的媒体描述和连接建立过程都是一致的,只要终端之间开放媒体协商的通道,就可以建立起实时通信,“微信”与“WhatsApp”能建立视频通话,就像你在中国用手机跟美国的朋友家中的座机打电话一样。那多美好!推动这一天的早日到来难道不也是我们互联网音视频通信工作者们的历史责任吗?  怎么做基于WebRTC的应用开发?  首先当然要让终端具备WebRTC能力。如果终端运行环境是浏览器,目前绝大部分浏览器都已经实现了对WebRTC的支持(其中Safari和Edge的支持还在持续完善中),虽然彼此有一些差异,但是可以借助adapter.js等适配层屏蔽掉这些差异。如果终端运行环境不是浏览器,则可以采用其他的开源SDK或商业SDK,将其集成在终端应用程序中。当然也可以基于Google的开源WebRTC实现的Native代码进行裁剪或移植。值得一提的是Google的开源WebRTC代码库中有大量的终端多媒体问题和传输问题的应对方案的实现,包括音视频的编解码、同步、带宽预测、QoS,AEC等,都是做终端(特别是IoT设备或桌面环境应用)开发时很好的参考。    

终端实现了WebRTC只是表示它具备了实时通信的能力,但各个终端任然是孤立的,需要将各个终端的SDP进行交换才能让它们完成媒体和传输的协商才能让各个终端之间真正通起来。WebRTC并未就各个实现之间交换SDP的传输方式以及终端的“寻址”方式做出规定,这跟具体应用场景和其实现方式高度相关。因此要实现基于WebRTC的应用还需要一些“额外”的工作,通过一个各个终端都“认识”并能“找到”的“中间人”来进行SDP交换。

譬如最简单的“1对1”呼叫的场景,这个“中间人”就是信令服务器,这种WebRTC的信令服务器可以基于任何消息系统构建,有很多开源实现可以利用或参考,自研开发也并不复杂。  如果要基于WebRTC做“1对多”或者“多对多”的实时通信应用,则情况要复杂一些,具体的做法也会因实际应用场景而不同,根据通信终端之间的媒体流拓扑结构,大体上可以分为Peer2Peer(终端点对点连接)模式、SFU(Selective Forwarding Unit,服务器选择性转发)模式和MCU(MultipointControl Unit,服务器混音混流)模式。  

Peer2Peer模式(所有参与方均需与其他所有参与方通信的情景又叫Mesh模式)的特征是呼叫中每两个需要进行通信的参与者之间都建立起点对点的媒体连接(PeerConnection),所有的媒体连接都是终端之间的(有可能通过TURN服务器进行NAT穿越,但不影响本质流拓扑),服务器侧不参与。

Peer2Peer模式的优点是媒体拓扑去中心化,服务器侧实现简单,只需要将各个终端之间的信令交换送达即可;缺点是终端需要受理多路媒体流的收发,随着呼叫中参与方数的增加,媒体连接数会阶乘函数式增长,无论对终端的编解码计算力还是带宽资源都会带来巨大的压力。如果一个呼叫中参数方数很少(譬如大多数时间2方偶尔3方),则可以考虑选用Peer2Peer模式的服务器侧实现方案。

猜你喜欢

转载自blog.csdn.net/chehec2010/article/details/87378107