======React Demo 简介====== 请参考[[https://juejin.im/post/5dafc32df265da5b926be0bf|React webIm demo简介 ]] ==== 环信IM+声网音视频实现音视频通话方案介绍 ==== 我们的demo webim 中单聊、群聊的音视频功能是使用环信im+声网音视频去实现的,具体实现思路是使用环信IM SDk 收发消息去做信令,实现邀请、更新视频通话状态, 通过声网音视频SDK实现视频通话,并且能和安卓、IOS端互通。 ===== 准备条件 ===== **如果要实现RTC功能,你需要满足以下条件:** * **你已分别创建了环信应用及声网应用** * **已完成环信IM的基本功能,包括登录、好友、群组以及会话等的集成** * **上线之前开通声网token验证时,用户需要实现自己的AppServer,根据环信ID,生成Token,创建Token服务及使用AppServer生成Token的过程参见https://docs.agora.io/cn/live-streaming/token_server** * **我们提供了开源的AppServer,可以供参考:https://github.com/easemob/easemob-im-app-server/tree/master/agora-app-server** === 体验demo === 1、线上地址[[https://webim-h5.easemob.com/|webim]] 2、本地跑通demo * 首先将本源码克隆到本地 $ git clone https://github.com/easemob/webim.git * 定位到 webim/demo 目录 在终端执行下面的命令,安装测试所需要的依赖模块 $ npm i * 启动项目 HTTPS=true npm start 登陆后在单聊或群聊里面点击摄像头的icon去发起音视频,体验音视频功能。 ==== 通话流程 ==== 我们定义了一套音视频呼叫的流程 呼叫流程 caller -------------------------------------- callee ----inviting----> <----alerting---- ----confirmRing----> <----answerCall---- ----confirmCallee----> <----cancelCall----> 说明: inviting 发送邀请消息,包含channelName callerDevId callId alerting 回复 包含calleeDevId,callerDevId, callId confirmRing: 主叫确认呼叫状态 包含 status TRUE为有效,FALSE为无效, callerDevId, calleeDevId, callId answerCall:被叫回复操作类型 包含:result, // busy/accept/refuse confirmCallee;主叫回复操作类型 包含:result, // busy/accept/refuse cancelCall: 挂断 包含callerDevId,callId 我们通过IM SDK 的CMD消息定义了以上这些指定消息,例如发送alerting: WebIM.conn.send(msg.body); var id = WebIM.conn.getUniqueId(); //生成本地消息id var msg = new WebIM.message('cmd', id); //创建命令消息 msg.set({ to: to, action : 'rtcCall', ext: { action: 'alert', calleeDevId: WebIM.conn.context.jid.clientResource, callerDevId: ‘calleeDevId’, callId: ‘callId’, ts: Date.now(), msgType: 'rtcCallWithAgora' }, success: function ( id,serverMsgId ) {}, fail: function(e){} }); WebIM.conn.send(msg.body); 全部指令请参考demo下 redux/VIdeoCallRedux.js 接收到指令消息后的处理逻辑在redux/WebIMRedux.js 实现了包含对超时、拒接、多端登录等情景的处理,当协商成功之后就会调用 join方法加入音视频通话中。 ui组件在项目的components/videoCall下面,在 layout/DefaultLayout里面使用,组件根据当前呼叫的状态来显示隐藏。