Android:WebRtc实现多人音视频(上)

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

前言

Android端采用WebRtc实现多人音视频的教程和书籍确实比较少,本身WebRtc是谷歌针对浏览器开源的即时通讯项目。就连文档几乎都是针对Web端的,移动端的文档几乎是找不到,零星能看到一些demo,但几乎都是无法运行或各种报错。经过长达几个月的踩坑,这里总结出了一套踩坑经验,这就慢慢道来。

首先需要知道,要实现多人音视频的功能是需要服务端做辅助的,用长连接工具做信令交换,外网访问还需要搭建stun服务做穿透建立连接。可以实现跨端连接,移动端和Web端互通。

最基础的认识这里就不展开说明,我们直接来干货,就整个音视频的流程先进行一个简单的梳理:

  • Socket与服务器建立长连接

主要用于交换信令,以达到WebRTC建立连接的基础。

  • 创建并初始化PeerConnectionFactory,再使用其创建出PeerConnection

PeerConnection听名字就知道很关键,它是建立音视频连接的重要类。每一路连接就需要一个PeerConnection对象,所以,多人连接我们就需要维护一个PeerConnection集合。PeerConnection是由PeerConnectionFactory所创建,全局仅需要一个实例即可。这里需要说明下,如需公网通讯,还要服务端搭建一个stun/turn服务。其他端口在初始化PeerConnection的时候需要传入带有该服务账号信息的IceServer集合作为入参。

  • A端发送OFFER

发送offer前需要通过PeerConnection创建offer,根据SdpObserver实现类监听onCreateSuccess方法内结果进行设置本地的Description。设置完成后还得监听onSetSuccess方法内是否设置本地Description成功,再通过Socket发送成功后的Description信息。

此时PeerConnection.Observer的实现类中onIceCandidate方法会收到回调,主要内容是收集的候选地址。如果是公网使用,此处必须转发给其他端口。

  • B端接受OFFER后创建ANSER发送给A端

当A端发送offer后,服务端会转发A端发送的信息给B端,此时B端接收Socket的信息。将该Description信息通过PeerConnection设置为远端Description。同上,也是会触发设置是否成功的回调onSetSuccess,再通过PeerConnection创建answer。根据创建是否成功的结果再将answer的Description信息发送给A端。

此时PeerConnection.Observer的实现类中onIceCandidate方法会收到回调,主要内容是收集的候选地址。如果是公网使用,此处必须转发给其他端口。

  • AB端相互收到对方通过Socket发来的ICE信息

收到对方发送的ICE信息,这时候使用PeerConnection通过addRemoteIceCandidate方法添加完成地址匹配。

  • A端收到B端发送的ANSER

此时A端会收到服务端转发B端发送的answer信息,通过PeerConnection将answer信息设置为远端的Description。

总结

其实就是AB两端互换了sdp信息,如果是公网则还需要呼唤并匹配ice征集的ip地址。如果只是内网需求不需要搭理ice这块。多人音视频也是基于此流程,无非就是在多管理一个PeerConnection集合,每增加一个人对应的增加一个PeerConnection即可。

好了,本篇先简单介绍下基础流程,下篇我们用代码来做个简单实现。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情