Flutter+WebRTC+gRPC开发点对点加密即时通讯APP--WebRTC入门介绍
开篇
基于Flutter+WebRTC+gRPC,开发一款点对点加密、跨端、即时通讯APP,实现文字、音视频通话聊天,同时支持图片、短视频等文件传输功能,计划支持Windows、Android平台。我准备将自己的学习和实践过程记录下来,同时分享给大家,欢迎大家一起研讨交流。这个工程是利用自己的业余时间来实现的,不定时更新。这是第三篇文章,是关于WebRTC的入门介绍。我们的端到端加密音视频通话APP计划基于WebRTC协议进行开发,现在我们就来简单了解一下WebRTC协议。
什么是WebRTC
WebRTC(Web Real-Time Communications)是一项实时通讯技术,是一个由Google发起的实时通讯解决方案,其中包含视频音频采集,编解码,数据传输,音视频展示等功能,并且还支持跨平台,包括linux、windows、mac、android等。WebRTC允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。它于2011年6月1日开源,2021年1月26日,成为W3C正式标准。对于开发者来说可以借助WebRTC非常方便实现低延时视频通话能力。
WebRTC特点与应用场景
平台和设备的独立。开发人员可以无需担心平台的兼容性。用户无需安装即可使用。
点对点加密,无需中间服务器进行数据中间处理,用户所有通信都是加密的, WebRTC通过SRTP对语音和视频进行加密安全处理,保障了其他人不能对其进行监听。
支持可靠性传输创建,WebRTC提供了可靠性传输方式,开发人员无需担心NAT带来的问题,在NAT环境下仍然可以实现传输的稳定性。
较低的时延。相比目前直播场景大多数的技术,WebRTC可以提供更低的时延。
较好的性能。TCP传输会涉及到拥塞算法、会话保持等相关的逻辑,在整体性能上会比UDP稍差一些。
总的来说,WebRTC具有传输速度快,低延迟,强大的音视频处理能力,免插件,先进的音视频编解码器,强制加密协议等优势,适合实时性要求较高的应用场景。应用场景包括但不限于电话会议、视频通话和直播、远程访问、文件共享、音视频实时互动、音视频处理(回音消除、降噪等)、云游戏等。
WebRTC常用API
getUserMedia:访问数据流,例如来自用户的相机和麦克风,从客户摄像头或麦克风获取的媒体流对象。
RTCPeerConnection: 连接对象,用于连接建立,媒体流传输,通过加密和带宽管理工具启用音频或视频通话。
RTCDataChannel: 数据传输通道,支持通用数据的点对点通信,常用于数据点到点的传输。
WebRTC建立连接过程
X想要和Y建立连接。 X创建了一个offer,它寻找所有的ICE candidate、安全选项、音视频选项等并创建SDP(offer),并设置它为本地描述。 X将SDP信令(offer)传递给Y。 Y根据X的offer进行设置,设置它为远端描述,并创建应答(answer),将应答设置它为Y的本地描述。 Y将Answer传递给X。 X收到Answer后设置它为远端描述,X与Y连接建立。
用到的API与详细的流程如图所示
可以看到上述流程涉及到offer与answer的传递,WebRTC协议并没有规定如何交换这两个参数,所以我打算基于gRPC协议进行通讯。两端想要P2P通信,那两端之间则需要一个额外的服务器来分享会话控制信息,交换IP地址和端口等网络信息,交换用户的编解码器以及媒体格式,交换初始数据后完成WebRTC连接,这个负责交换的就是信令(Signal)服务器。
SDP与Candidate
WebRTC使用SDP来描述媒体信息,用于媒体协商时决定双方是否可以进行通信,SDP由会话描述和媒体描述两部分构成,媒体描述通常包括两个描述:一个音频媒体描述,一个视频媒体描述。
当媒体协商完成后,WebRTC就开始建立网络连接了,其过程称为ICE。Candidate是WebRTC用来描述它可以连接的远端的基本信息,它包括address,port,protocol三元组的一个信息集。ICE中使用的Candidate有四种,它们的优先级由高到低分别为host、srflx、prflx、relay,WebRTC进行连接建立时,就是按照这个次序尝试建立连接的,WebRTC默认会选择最好的链路传输音视频数据,即如果通信的双方在同一网段中,则先使用内网连接;如果通信的双方不在同一网段,则优先使用P2P;最后的方案,则是使用relay服务进行中转。
其他涉及到的相关知识,例如NAT穿越,STUN和TURN,暂时先不考虑。