最近有幸看到Agora发布的RTC演讲通知,参加了几次云上讲座,由于本人之前一直从事通讯行业,而且做过电信运营商的通讯设备的研发,对于RTC技术一直比较感兴趣,在此分享一下我的理解。
RTC-Real Time Communication,实时通讯技术。提到实时通讯,大家最熟悉的就是大家打电话,电信网当然也经历了2G,3G,4G,5G,到了4G,5G主要无线侧和流量发展,实时通讯其实并没有特别大的变化,还是语音和视频,这里就不再赘述了。
后来只是实时通讯满足不了广大人民群众日益丰富的生活需求了,所以OTT蓬勃发展起来了,像大家熟悉的微博、微信,因为大家很多事情并不需要实时的高速某个人,比如只是晒一下自己当下的心情/美食/有趣的段子,并不需要对方秒回或者立马给出响应的表达。
当然实时通讯还是有众多需要使用的场景,像疫情期间因远程办公暴增的语音/视频会议,这两年火到不行的直播带货,实时通讯再一次进入了人们关注的视线;但是如果这些都基于运营商现有的实时通讯机制,很难满足日益丰富/变化的广大人民群众的需求,并且资费也会是很大的问题,毕竟电话通讯比流量还是要贵很多的,因此基于非运营商通讯网的实时通讯技术得到了很大的发展。
很多公司看到了这类需求,其中最著名的就是Google推出的WebRTC技术,以及国内做的最好的Agora声网。WebRTC其实扩展了RTC的发展领域,本身是一个由Google发起的实时通讯解决方案,基于系统原生自带的浏览器,开发者就可以快速地构建出一个音视频通讯应用,并且该项目是完全开源的。
在Google推出了WebRTC之后,W3C标准组织和IEFT组织迅速建立了标准组,完善整个的技术标准体系,这也使得WebRTC的通用化提供了比较好的基础,WebRTC事实上也成为了一种通讯标准。
WebRTC的整体架构思路和流程如下图,WebRTC对于媒体处理做了很好的封装
但是在最初的WebRTC里是没有定义信令(Signaling)协议的,开发者可以自由发挥,事实上也确实很多不同协议的信令处理诞生,HTTP Restful,Json over websocket, sip over http或者sip plugin都可以。一般来说需要有一个双方都能访问的中心端服务器来存储通讯双方(Caller和Callee)的信息,同时中心端服务器来帮助他们交换连接所需要的信息信令协议的目的是为了媒体通讯的双方能够获取的通讯对端的存在(包括媒体通讯的IP地址,端口,音视频编解码格式协商等),这样主叫Caller和被叫Callee就可以相互发送媒体数据了。
(图里的例子是Browser之间P2P直接媒体互通的,这种情况在没有对称NAT情况下是可以,有NAT情况就需要用到STUN/TURN技术,这里不再详细描述了)
当然还有一种媒体互通的方式,就是信令和媒体都走中心端,中心端都具备公网IP,这样就可以避免穿NAT的问题(Agora声网的处理就是使用的这种方式)。
当然通过讲座了解到,发展到当前,Agora已经超越了浏览器以及WebRTC的范畴,扩展到了移动端Android以及IOS,Windows APP,以及嵌入端Linux APP;(当然支持不同的浏览器本身也就实现了安卓和IOS端,但是毕竟移动端和嵌入式端使用网页还是比较少,使用APP比较多)。
好了,言归正传,上面说了这么多,其实是想讲一下真正打通一个点对点通话,流程是如何的,这样对于下面做SDK集成开发个人觉得会比较有帮助,不然只是打通,并不知道其中有哪些技术路径需要理解和掌握。
我这次用的是IOT的SDK-RTSA-lite;首先到Github上下载RTSA的源码,因为只是做验证,所以我用了Ubuntu的虚拟机来进行编译和运行。编译的设备不管是虚拟机还是物理设备,最好都是可以连接互联网的,编译里有很多依赖的音视频代码或者库需要下载,不然就需要自己手工下载上传去部署。
(https://github.com/AgoraIO/Basic-RTSA)
下载后,进入RTSA-lite目录下,可以看到目录分布,cross_compile.zh.md是做交叉编译的说明,后续如果移植到树莓派编译的话,再参考这个;agora_sdk放置的是so动态库,提供对开发者的API接口;third_party中是http,json,media的解析库,应该是信令协商用到的库;
最后是example,进到目录下进行编译,编译很快,秒完
在执行example之前,需要激活license,这个需要在agora官网创建账号和project,大家直接去官网操作即可,唯一的是大家当前申请License的时候最好加一下Agora的研发交流群,遇到的问题可以在里面快速得到解答,这里绝不是广告,因为我在申请License的时候就遇到了绑定project的问题。按照README.md的步骤修改license.cfg,激活,就可以运行了。不过例子程序只有发送视频和音频,当然API提供了接收操作的API,大家在agora_rtc_api.h里就可以找到了(如下图),仿照例子写一个就可以,这里就不贴代码了。
在讲座中,我也问到了,SDK也提供了数据通道(datachannel),这个在嵌入式端是非常有用的,除了实时通讯外,可能需要相互传递一些指令或者文件或者图片等,都可以通过数据通道传输,我曾经在巴展上看过爱立信的使用案例,使用WebRTC的DataChannel远程控制挖掘机进行挖掘作业,后续会尝试使用数据通道完成一些应用,完成后再分享。
写在最后,Agora的SDK还是比较简单易集成的,随着需求和技术的发展,实时通讯我个人认为会作为一种基本能力出现在各个应用场景,比如网络游戏,语音客服,机器人控制,视频监控,办公会议等等更不必说,况且今年Google的WebRTC开放了很多API能力,以便可以和AR,声音模拟等场景进行结合和创新,感谢在这块的技术发展还是大有可为的。其实关于实时通讯,除了端侧简单易集成之外,通讯质量也是需要保证的,这里了解到声网已经部署了想躲规模的服务器,使用了SD-RTN技术(之前有幸也做过短时间的技术分析和研究)进行传输路径优化,确保通讯质量。后续大家如果只是打个电话,可能使用免费微信的通话就可以了,但是如果需要在自己的应用中添加实时通讯能力,大家还是需要对RTC技术的原理和发展进行了解的。
本文为个人原创,首发于 声网开发者社区[https://rtcdeveloper.com/t/to...]