======= Web集成1对1通话 ======= ====== 跑通Demo ======= ===== 示例代码 ===== ** 1.进入官网下载页面[[http://www.easemob.com/download/im|下载环信demo]],点击Web平台的SDK+Demo源码,下载最新Demo源码 **\\ ** 2.进入github开源网站 [[https://github.com/easemob/webim|克隆代码]] **\\ ===== 前提条件 ===== 1.安装一款 Easemob Web SDK 支持的浏览器 2.本地安装 node 环境 >= 6.3.0 ===== 运行 Demo ===== 1. demo 目录结构 webim/demo\\ 2. 进入 webim/demo 文件夹\\ 3. 安装依赖包 npm install 4. 启动项目 HTTPS=true npm start ====== 快速集成 ====== ===== 1. 环信后台注册 appkey ===== 在开始集成前,你需要注册环信开发者账号并创建后台应用,参见[[http://docs-im.easemob.com/im/ios/sdk/prepare#注册并创建应用|注册并创建应用]] ===== 2. 创建项目 ===== a.可以简单的写一个 html,引入 SDK 测试 b.或者使用 脚手架搭建一个项目 ===== 3.引入 SDK ===== '' ** 1v1 需要依赖 IM SDK 进行通信,所以首先需要引入 IM SDK ** '' \\ === 3.1通过 scrpit 标签的 src 引入 === //im SDK ===3.2使用 npm 获取 SDK=== npm install easemob-websdk --save npm install easemob-webrtc --save ===== 4.初始化 SDK ===== '' ** 必须依赖 IM SDK [[http://docs-im.easemob.com/im/web/intro/integration|IM SDK 集成文档]] ** ''\\ ===4.1 引入 sdk === import webrtc from 'easemob-webrtc' === 4.2 初始化 WebRTC Call,用于实现 1v1 音视频通话 === var rtcCall = new webrtc.Call({ connection: conn, // WebIM 的链接信息 mediaStreamConstaints: { audio: true, video: true /** * 修改默认摄像头,可以按照以下设置,不支持视频过程中切换 * video:{ 'facingMode': "user" } 调用前置摄像头 * video: { facingMode: { exact: "environment" } } 后置 */ }, listener: { onAcceptCall: function (from, options) { console.log('onAcceptCall::', 'from: ', from, 'options: ', options); }, //通过streamType区分视频流和音频流,streamType: 'VOICE'(音频流),'VIDEO'(视频流) onGotRemoteStream: function (stream, streamType) { console.log('onGotRemoteStream::', 'stream: ', stream, 'streamType: ', streamType); var video = document.getElementById('video'); video.srcObject = stream; }, onGotLocalStream: function (stream, streamType) { console.log('onGotLocalStream::', 'stream:', stream, 'streamType: ', streamType); var video = document.getElementById('localVideo'); video.srcObject = stream; }, onRinging: function (caller, streamType) { console.log("onRinging", caller) }, onTermCall: function (reason) { console.log('onTermCall::'); console.log('reason:', reason); }, onIceConnectionStateChange: function (iceState) { console.log('onIceConnectionStateChange::', 'iceState:', iceState); }, // 通话断网监听 onNetWorkDisconnect(endType) { // endType: local || remote, 哪一端断网 console.log('1v1 onNetWorkDisconnect', endType); }, onError: function (e) { console.log(e); } } }); ===== 5.视频呼叫 ===== ** 整个呼叫过程:\\ 1. 主叫发起呼叫 \\ 2. 被叫收到呼叫(主叫被叫分属于两个页面,通过服务器发送消息)\\ 3. 被叫接受呼叫或者拒绝呼叫 \\ 4. 主叫收到被叫接受或者拒绝的回调 \\ 5. 通话建立成功 \\ 6. 一方挂断另一方收到挂断的回调 ** ** config 参数为主动呼叫时的配置参数(该功能主要用作web端对APP端呼叫时使用) ** var config = { push: true, // 对方(app端)不在线时是否推送 timeoutTime: 30000, // 超时时间 txtMsg: 'I gave you a video call.', // 给对方发送的消息 pushMsg: 'user is calling you' //推送内容 }; === 5.1 主叫发起呼叫 === callBtn.onclick = function () { rtcCall.caller = 'mengyuanyuan'; // 指定呼叫方名字 rtcCall.makeVideoCall(callee,null,true,true,config); }; 在 rtcCall.makeVideoCall 方法中 注意以下参数的设置\\ * 第一个参数callee: 被呼叫人名字 必需 string * 第二个参数 指定传 null 必需 null * 第三个参数 是否开启录制 非必需 boolean * 第四个参数 是否开启录制合并 非必需 boolean * 第五个参数 主动呼叫扩展配置 非必需 object === 5.2 被叫方收到呼叫回调 === // 初始化的函数 var rtcCall = new webrtc.Call({ ... listener: { ... onRinging: function (caller, streamType) { console.log("onRinging", caller) }, } }); === 5.3 被叫方接受呼叫 === rtcCall.acceptCall() // 无参数 === 5.4 主叫方收到被叫接受呼叫的回调 === // 初始化的函数 var rtcCall = new webrtc.Call({ ... listener: { ... onGotLocalStream: function (stream, streamType) { // stream:媒体流,streamType:流类型 VIDEO 视频流、VOICE 语音流, 可根据不同的流类型做不同的UI展示 var video = document.getElementById('localVideo'); video.srcObject = stream; // 将流设置给 video标签 用于显示 }, } }); ===== 6. 关掉/拒绝通话 ===== rtcCall.endCall() // 无参数 === 6.1 收到通话结束的回调 === // 初始化的函数 var rtcCall = new webrtc.Call({ ... listener: { ... onTermCall: function (reason) { }, } }); ===== 7. 音频通话 ===== 音频通话步骤与视频通话一致 回调方法共用 只是在回调中的 streamType 不同 结束通话方法相同 === 7.1 发起音频通话 === callBtn.onclick = function () { rtcCall.caller = 'mengyuanyuan'; // 指定呼叫方名字 rtcCall.makeVoiceCall('asdfghj',null,true,true,config); }; ====== 进阶功能 ====== ===== 取日志 ===== 在控制台 调用 WebIM.EMedia.fileReport 方法可下载日志文件 WebIM.EMedia.fileReport() // 无参数 ===== 通话中音视频控制 ===== 调用 rtcCall.controlStream 方法可以控制 音视频的打开/关闭 rtcCall.controlStream(controlType, to) 在 rtcCall.controlStream 方法中 注意以下参数的设置\\ * controlType: 操作类型 ** 0:打开麦克风;1:关闭麦克风;2:关闭摄像头;3:打开摄像头 **,必需 number * to: 对方 userId,,必需 string ** 对方会收到回调函数 ** // 对方操作音频的回调 opened: true:打开音频、false:关闭音频 onOtherUserOpenVoice: function (from, opened) { } , // 对方操作视频的回调 opened: true:打开视频、false:关闭视频 onOtherUserOpenVideo: function (from, opened) { }, ===== 设置通话参数 ===== 可以在初始化 ** rtcCall ** 的时候,指定** mediaStreamConstaints **字段 \\ 自定义分辨率、采样率 var rtcCall = new webrtc.Call({ ... mediaStreamConstaints: { audio: { //音频采样率 sampleRate: 44100, sampleSize: 16 }, video: { // 视频分辨率 宽度和高度 width: { exact: 1280 }, height: { exact: 720 } } }, }, ===== 离线推送 ===== 在进行视频或者音频呼叫的时候,可指定是否推送消息 var config = { push: true, // 对方(app端)不在线时是否推送 ... }; callBtn.onclick = function () { rtcCall.caller = 'mengyuanyuan'; // 指定呼叫方名字 rtcCall.makeVideoCall(callee,null,true,true,config); }; ===== 云端录制 ===== 在进行视频或者音频呼叫的时候,可指定是否录制和录制合并 var option = { callee: //被叫者, rec: //是否开启录制, recMerge: //是否开启录制合并, config: //其他配置参数 } callBtn.onclick = function () { rtcCall.caller = 'mengyuanyuan'; // 指定呼叫方名字 rtcCall.makeVideoCall(option.callee,null,option.rec,option.recMerge,option.config); }; ===== 断网检测 ===== ** 在通话进行前指定监听函数 onNetWorkDisconnect ** var rtcCall = new webrtc.Call({ ... listener: { ... onNetWorkDisconnect(endType) { // endType: local || remote, 哪一端断网 console.log('1v1 onNetWorkDisconnect', endType); }, } }) ===== 海外代理 ===== 1v1通话支持不同集群区域的人员通话使用代理,减小延迟; 使用多集群代理需要音视频后台配置IP及端口的映射文件rtcconfig.json,并禁用相关appkey的直连, 也可以指定 rtcconfig.json 的私有化部署 调用 ** webrtc.emedia.config 方法开启海外代理 ** webrtc.emedia.config({ ... useDeployMore: true, // 默认:false 不开启 rtcConfigUrl: 'your rtcConfigUrl' // 如果不设置,将使用 sdk 后台配置的代理文件 }) ===== 私有部署 ===== 私有部署设置方法参见[[http://docs-im.easemob.com/im/web/other/privatedeploy|私有云sdk集成配置]]。 ====== 客户端api ====== 1V1音视频通话的API包括以下接口 * option 创建通话类的参数配置 * makeVideoCall 发起视频呼叫 * makeVoiceCall 发起音频呼叫 ^ 方法 ^ 功能 | [[http://webim-h5.easemob.com/webrtc/jsdoc/out/-_Call.html | option]] | 创建类时的配置 | | [[http://webim-h5.easemob.com/webrtc/jsdoc/out/global.html#makeVideoCall | makeVideoCall]] | 发起视频通话| | [[http://webim-h5.easemob.com/webrtc/jsdoc/out/global.html#makeVoiceCall | makeVoiceCall]] | 发起音频通话|