差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
rtc:one2one:web [2020/07/29 02:59]
zhangdong [集成步骤]
rtc:one2one:web [2020/12/17 08:37] (当前版本)
huangfeipeng [5.视频呼叫]
行 1: 行 1:
-====== Web集成1对1通话 ======+======= Web集成1对1通话 ​=======
  
-easemob-webrtc 支持实时话功能。用户可以与好友进行实时视频聊天。+====== 跑Demo ======= 
 +===== 示例代码 =====
  
-**注意:** ''​视频通话功能只支持 https+Webkit 浏览器。 +** 1.进入官网下载页面[[http://​www.easemob.com/​download/​im|下载环信demo]],点击Web平台的SDK+Demo源码,下载最新Demo源码 ​**\\ 
-不支持使用http/socks5 ​理。''​ +** 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. 安装依赖包 
 +<code javascript>​ 
 +   npm install 
 +</​code>​ 
 +4. 启动项目 
 +<code javascript>​ 
 +   ​HTTPS=true npm start 
 +</​code>​
  
-说明:easemob-webrtc包含了easemob-emedia,easemob-webrtc为单人+多人sdk,easemob-emedia为多人sdk,当然也可以用easemob-emedia自己去实现单人1v1的场景,两个sdk只需要引入其中一个。 
  
-1. 引入文件其中easemob-webrtc音视频sdk依赖easemob-websdk即时讯sdk支持npm安装和<​script>​标签两种方式引入+====== 快速集成 ====== 
 +===== 1. 环信后台注册 appkey ===== 
 +在开始集成前你需要注册环信开发者账号并创建后台应用,参见[[http://​docs-im.easemob.com/​im/​ios/​sdk/​prepare#​注册并创建应用|注册并创建应用]] 
 +===== 2. 创建项目 ===== 
 +  a.可以简单的写一个 html,引入 SDK 测试  
 +  b.或者使用 脚手架搭建一个项目 
 +===== 3.引入 SDK =====  
 +''​ ** 1v1 需要依赖 ​IM SDK 进行所以首先需要引入 ​IM SDK ** ''​ \\ 
  
-a. 通过npm安装 ​+=== 3.1通过 ​scrpit 标签的 src 引入 === 
 +<code javascript>​ 
 +<script src="​../​sdk/​webimSDK.js"></​script>​ //im SDK 
 +<script src="​../​sdk/​EMedia_x1v1.js"></​script>​ 
 +</​code>​ 
 +===3.2使用 ​npm 获取 SDK===
 <code javascript>​ <code javascript>​
 npm install easemob-websdk --save npm install easemob-websdk --save
 npm install easemob-webrtc --save npm install easemob-webrtc --save
-npm install easemob-emedia --save 
-</​code>​ 
-b.通过<​script>​标签引入,​WebIMConfig.js为webimSDK的配置文件 
-<code html> 
-<script src="​./​WebIMConfig.js"></​script>​ //​webimSDK配置文件 
-<script src="​../​sdk/​webimSDK.js"></​script>​ //im SDK 
-<script src="​../​sdk/​EMedia_x1v1.js"></​script>​ 或者 <script src="​../​sdk/​EMedia_sdk-dev.js"></​script>​ //​音视频SDK 
 </​code>​ </​code>​
  
-2. 初始化 WebRTC Call 。 +===== 4.初始化 SDK ===== 
 +''​ ** 必须依赖 IM SDK [[http://​docs-im.easemob.com/​im/​web/​intro/​integration|IM SDK 集成文档]] ** ''​\\ 
 +===4.1 引入 sdk ===  
 +<code javascript>​ 
 +import webrtc from '​easemob-webrtc'​ 
 +</​code>​ 
 +=== 4.2 初始化 WebRTC Call,用于实现 1v1 音视频通话 ===
 <code javascript>​ <code javascript>​
-var rtcCall = new WebIM.WebRTC.Call({ +var rtcCall = new webrtc.Call({ 
-    connection: conn,+    connection: conn, // WebIM 的链接信息
  mediaStreamConstaints:​ {  mediaStreamConstaints:​ {
             audio: true,             audio: true,
行 66: 行 88:
  console.log('​onIceConnectionStateChange::',​ '​iceState:',​ iceState);  console.log('​onIceConnectionStateChange::',​ '​iceState:',​ iceState);
  },  },
 +        // 通话断网监听
 +        onNetWorkDisconnect(endType) { // endType: local || remote, 哪一端断网
 +            console.log('​1v1 onNetWorkDisconnect',​ endType);
 +        },
         onError: function (e) {         onError: function (e) {
             console.log(e);​             console.log(e);​
行 73: 行 99:
 </​code>​ </​code>​
  
-3. 调用 RTC 口。+===== 5.视频呼叫 ===== 
 +** 整个呼叫过程:\\ 
 +    1. 主叫发起呼叫 \\ 
 +    2. 被叫收到呼叫(主叫被叫分属于两个页面,通过服务器发送消息)\\ 
 +    ​3. 被叫受呼叫或者拒绝呼叫 \\ 
 +    4. 主叫收到被叫接受或者拒绝的回调 \\ 
 +    5. 通话建立成功 \\ 
 +    6. 一方挂断另一方收到挂断的回调 ** 
  
 +** config 参数为主动呼叫时的配置参数(该功能主要用作web端对APP端呼叫时使用) **
 <code javascript>​ <code javascript>​
-    // 视频呼叫对方 +var config = {
-    ​var config = {+
         push: true, // 对方(app端)不在线时是否推送         push: true, // 对方(app端)不在线时是否推送
         timeoutTime:​ 30000, // 超时时间         timeoutTime:​ 30000, // 超时时间
行 83: 行 116:
         pushMsg: 'user is calling you' //​推送内容         pushMsg: 'user is calling you' //​推送内容
     };     };
-    var call = function () { 
-        rtcCall.caller = '​mengyuanyuan';​ 
-        //​第三个参数为是否录制、第四个参数为是否合并,参数可以为空 
-        rtcCall.makeVideoCall('​asdfghj',​null,​true,​true,​config);​ 
-    }; 
-    // 音频呼叫对方 
-    var call = function () { 
-        rtcCall.caller = '​mengyuanyuan';​ 
-        rtcCall.makeVoiceCall('​asdfghj',​null,​true,​true,​config);//​用法同视频 
-    }; 
-    // 关掉/​拒绝视频 
-    var endCall = function () { 
-        rtcCall.endCall();​ 
-    } 
-    // 接受对方呼叫 
-    var acceptCall = function () { 
-        rtcCall.acceptCall();​ 
-    } 
 </​code>​ </​code>​
  
-4事件。+=== 5.1 主叫发起呼叫 === 
 +<code javascript>​ 
 +callBtn.onclick = function () { 
 +    rtcCall.caller = '​mengyuanyuan';​ // 指呼叫方名字 
 +    rtcCall.makeVideoCall(callee,​null,​true,​true,​config);​ 
 +}; 
 +</​code>​
  
 +在 rtcCall.makeVideoCall 方法中 注意以下参数的设置\\
 +  * 第一个参数callee:​ 被呼叫人名字 必需 string
 +  * 第二个参数 指定传 null 必需 null
 +  * 第三个参数 是否开启录制 非必需 boolean
 +  * 第四个参数 是否开启录制合并 非必需 boolean
 +  * 第五个参数 主动呼叫扩展配置 非必需 object
 +
 +
 +=== 5.2 被叫方收到呼叫回调 ===
 <code javascript>​ <code javascript>​
-document.getElementById('​rtCall'​).onclick = call; +// 初始化的函数 
-document.getElementById('​rtEndCall'​).onclick = endCall; +var rtcCall = new webrtc.Call(
-document.getElementById('​rtAcceptCall'​).onclick = acceptCall;+    ​... 
 +    listener: { 
 + ... 
 + onRinging:​ function ​(caller, streamType{ 
 +                   console.log("​onRinging",​ caller) 
 + }, 
 +     } 
 +});
 </​code>​ </​code>​
  
-===== 问题 ​=====+=== 5.3 被叫方接受呼叫 ​==
 +<code javascript>​ 
 +rtcCall.acceptCall() // 无参数 
 +</​code>​ 
 + 
 +=== 5.4 主叫方收到被叫接受呼叫的回调 === 
 +<code javascript>​ 
 +// 初始化的函数 
 +var rtcCall = new webrtc.Call({ 
 +    ... 
 +    listener: { 
 + ... 
 + onGotLocalStream:​ function (stream, streamType) { 
 + // stream:媒体流,streamType:流类型 VIDEO 视频流、VOICE 语音流, 可根据不同的流类型做不同的UI展示 
 + var video = document.getElementById('​localVideo'​);​ 
 + video.srcObject = stream; // 将流设置给 video标签 用于显示 
 + }, 
 +     } 
 +}); 
 +</​code>​ 
 + 
 +===== 6. 关掉/​拒绝通话 ===== 
 +<code javascript>​ 
 +rtcCall.endCall() // 无参数 
 +</​code>​ 
 + 
 +=== 6.1 收到通话结束的回调 === 
 +<code javascript>​ 
 +// 初始化的函数 
 +var rtcCall = new webrtc.Call({ 
 +    ... 
 +    listener: { 
 + ... 
 + onTermCall:​ function (reason) { 
 +  
 + }, 
 +     } 
 +}); 
 +</​code>​ 
 +===== 7. 音频通话 ===== 
 +  音频通话步骤与视频通话一致 
 +  回调方法共用 
 +  只是在回调中的 streamType 不同 
 +  结束通话方法相同  
 +=== 7.1 发起音频通话 === 
 +<code javascript>​ 
 +callBtn.onclick = function () { 
 +    rtcCall.caller = '​mengyuanyuan';​ // 指定呼叫方名字 
 +    rtcCall.makeVoiceCall('​asdfghj',​null,​true,​true,​config);​ 
 +}; 
 +</​code>​ 
 +====== 进阶功能 ====== 
 +===== 取日志 ===== 
 +在控制台 调用 WebIM.EMedia.fileReport 方法可下载日志文件 
 +<code javascript>​ 
 +WebIM.EMedia.fileReport() // 无参数 
 +</​code>​ 
 +===== 通话中音视频控制 ===== 
 +调用 rtcCall.controlStream 方法可以控制 音视频的打开/​关闭 
 +<code javascript>​ 
 +rtcCall.controlStream(controlType,​ to) 
 +</​code>​ 
 +在 rtcCall.controlStream 方法中 注意以下参数的设置\\ 
 +  * controlType:​ 操作类型 ** 0:​打开麦克风;1:​关闭麦克风;2:​关闭摄像头;3:​打开摄像头 **,必需 number  
 +  * to: 对方 userId,,​必需 string 
 + 
 +** 对方会收到回调函数 ** 
 +<code javascript>​ 
 +// 对方操作音频的回调 opened: true:​打开音频、false:​关闭音频 
 +onOtherUserOpenVoice:​ function (from, opened) { } , 
 + 
 +// 对方操作视频的回调 opened: true:​打开视频、false:​关闭视频 
 +onOtherUserOpenVideo:​ function (from, opened) { }, 
 +</​code>​ 
 +===== 设置通话参数 ===== 
 +可以在初始化 ** rtcCall ** 的时候,指定** mediaStreamConstaints **字段 \\ 
 +自定义分辨率、采样率 
 +<code javascript>​ 
 +var rtcCall = new webrtc.Call({ 
 +      ... 
 +      mediaStreamConstaints:​ { 
 +            audio: { //​音频采样率 
 +                  sampleRate: 44100, 
 +                  sampleSize: 16 
 +            }, 
 +            video: { // 视频分辨率 宽度和高度 
 +                  width: { 
 +                    exact: 1280 
 +                  }, 
 +                  height: { 
 +                    exact: 720 
 +                  } 
 +            } 
 +      }, 
 +}, 
 +</​code>​ 
 + 
 +===== 离线推送 ===== 
 +在进行视频或者音频呼叫的时候,可指定是否推送消息 
 + 
 +<code javascript>​ 
 +var config = { 
 +    push: true, // 对方(app端)不在线时是否推送 
 +    ... 
 +}; 
 +callBtn.onclick = function () { 
 +    rtcCall.caller = '​mengyuanyuan';​ // 指定呼叫方名字 
 +    rtcCall.makeVideoCall(callee,​null,​true,​true,​config);​ 
 +}; 
 +</​code>​ 
 +===== 云端录制 ===== 
 +在进行视频或者音频呼叫的时候,可指定是否录制和录制合并 
 + 
 +<code javascript>​ 
 +var option = { 
 +  callee: //​被叫者, 
 +  rec: //​是否开启录制, 
 +  recMerge: //​是否开启录制合并, 
 +  config: //​其他配置参数 
 +
 +callBtn.onclick = function () { 
 +    rtcCall.caller = '​mengyuanyuan';​ // 指定呼叫方名字 
 +    rtcCall.makeVideoCall(option.callee,​null,​option.rec,​option.recMerge,​option.config);​ 
 +}; 
 +</​code>​ 
 +===== 断网检测 ===== 
 +** 在通话进行前指定监听函数 onNetWorkDisconnect ** 
 +<code javascript>​ 
 +var rtcCall = new webrtc.Call({ 
 +      ... 
 +      listener: { 
 +        ... 
 +        onNetWorkDisconnect(endType) { // endType: local || remote, 哪一端断网 
 +            console.log('​1v1 onNetWorkDisconnect',​ endType); 
 +        }, 
 +      } 
 +}) 
 + 
 +</​code>​ 
 +         
 +===== 海外代理 ===== 
 +  1v1通话支持不同集群区域的人员通话使用代理,减小延迟; 
 +  使用多集群代理需要音视频后台配置IP及端口的映射文件rtcconfig.json,​并禁用相关appkey的直连,​ 
 +  也可以指定 rtcconfig.json 的私有化部署 
 +调用 ** webrtc.emedia.config 方法开启海外代理 **  
 +<code javascript>​ 
 +webrtc.emedia.config({ 
 +   ... 
 +   ​useDeployMore:​ true, // 默认:false 不开启 
 +   ​rtcConfigUrl:​ 'your rtcConfigUrl'​ // 如果不设置,将使用 sdk 后台配置的代理文件 
 +}) 
 +</​code>​ 
 +===== 私有部署 ===== 
 + 
 +私有部署设置方法参[[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]] | 发起音频通话| 
 + 
 + 
 + 
 + 
 + 
  
-Q:发起视频聊天时,收到提示“An error occurred when calling webrtc”,怎么办? 
  
-A:请开启浏览器使用摄像头的权限。以Chrome为例,在地址栏中输入chrome:​%%//​%%settings/​content,在“内容设置”页面下拉,找到“摄像头”,选择“当网站要求使用您的摄像头时询问您(推荐)”。