1对1音视频通话


1v1实时通话允许用户发起、接听、挂断单人的音视频会话,可以在会话过程中进行暂停、恢复,并对会话过程进行监听。

1v1实时通话管理模块为EMCallManager,由EMClient模块加载时主动创建,可以使用EMClient模块的getCallManager方法获取,代码如下

var callManager = emclient.getCallManager();
function setCallManagerListener(callManager, listener) {
  // 收到会话请求
  listener.onRecvCallIncoming((callsession) => {
  // 在这里可以选择接通或者拒绝会话
  });
  // 会话连接上
  listener.onRecvCallConnected((callsession) => {
  // 会话连接上之后,如果是应答方,需要Answer信息
    if(!callsession.getIsCaller())
      callManager.sendAnswer(callsession.getCallId());
  });
  // 会话已接通
  listener.onRecvCallAccepted((callsession) => {});
  // 会话挂断,reason为挂断原因,0挂掉,1无响应,2拒绝,3忙碌,4失败,5不支持,6离线
  listener.onRecvCallEnded((callsession,reason,error) => {});
  // 网络状态变化,toStatus状态:0连接,1不稳定,2断开
  listener.onRecvCallNetworkStatusChanged((callsession,toStatus) => {});
  // 对方会话状态变化,type值:0音频暂停,1音频恢复,2视频暂停,3视频恢复
  listener.onRecvCallStateChanged((callsession,type) => {});
}
var managerlistener = new easemob.EMCallManagerListener();
setCallManagerListener(callManager, managerlistener);
// 添加回调监听
callManager.addListener(managerlistener);
//移除回调监听
callManager.removeListener(managerlistener);

用户可以主动发起单人会话,方法如下

/** 
 * 发起音视频会话asyncMakeCall
 * @param remoteName Srign,对方用户ID,输入参数
 * @param type Number,会话类型,0为音频,1为视频,输入参数
 * @param ext String,会话扩展信息,应答方可见
 * return {code:{Number},description:{String},data:{EMCallSession}}
 */
 let result = callManager.asyncMakeCall(remoteName,type,ext);

接听会话方法一般在收到onRecvCallIncoming后调用,方法如下

/** 
 * 接听音视频会话asyncAnswerCall
 * @param callId,String,呼叫方ID,输入参数
 */
callManager.asyncAnswerCall(callId);

callId可以通过callsession的getCallId()方法获取。

发送Answer消息由接听方在会话连接上之后调用,即onRecvCallConnected中调用,只有接听方才需要调用此接口,方法如下

/** 
 * 发送Answer消息
 * @param callId,String,呼叫方ID,输入参数
 */
callManager.sendAnswer(callId);

用户可以在收到会话请求时,直接挂断会话,也可以在通话过程中挂断,调用挂断电话API时,需要传入挂断原因

/** 
 * 接听音视频会话asyncEndCall
 * @param callId,String,呼叫方ID,输入参数
 * @param reason,Number 结束原因,0挂掉,1无响应,2拒绝,3忙碌,4失败,5不支持,6离线
 */
callManager.asyncEndCall(callId,reason);
/**
 * 修改会话类型,切换语音视频状态
 * @param {String} callId 呼叫方Id
 * @param {Number} controlType 修改后的类型,0语音暂停,1为语音继续,2视频暂停,3视频继续
 */
callManager.updateCal(callId,controlType);

获取配置

let emcallconfigs = callManager.getCallConfigs();
// 呼叫时,若对方不在线,是否发送离线通知
console.log("IsSendPushIfOffline:" + emcallconfigs.getIsSendPushIfOffline());
// 视频宽度
console.log("VideoResolutionWidth:" + emcallconfigs.getVideoResolutionWidth());
// 视频高度
console.log("VideoResolutionHeight:" + emcallconfigs.getVideoResolutionHeight());
// 音视频心跳周期
console.log("PingInterval:" + emcallconfigs.getPingInterval());

设置配置

// 呼叫时,若对方不在线,是否发送离线通知
emcallconfigs.setIsSendPushIfOffline(true);
// 视频宽度,高度
emcallconfigs.setVideoResolution(640,480);
// 音视频心跳周期
emcallconfigs.setPingInterval(60);
callManager.setCallConfigs(emcallconfigs);

会话接通后,需要使用音视频控件展示通话的音视频流,音视频流可通过注册回调得到,注册过程在注册消息回调监听时设置一次即可

// 处理对方的音视频流,回调函数参数:remoteStream为对方音视频流,type为类型,0音频,1视频
callManager.getRemoteStream((remoteStream,type) => {});
// 处理本地的音视频流,回调函数参数:remoteStream为本地音视频流,type为类型,0音频,1视频
callManager.getLocalStream((localStream,type) => {});

设置了若呼叫时,对方处于离线状态,执行的回调。当配置中设置了setIsSendPushIfOffline(true),该API可以应用。应用方法如下:

// 传入回调函数,回调函数的三个参数分别为本地发送方ID,对方ID,呼叫类型(0语音,1视频)
callManager.setSendPushMessage((from,to,type) => {
  let textMsgBody = new easemob.EMTextMessageBody(type == 0?"语音请求":"视频请求");
  let textMsg = easemob.createSendMessage(from, to, textMsgBody);
  let callback = new easemob.EMCallback();
      
  textMsg.setCallback(callback)
  emclient.getChatManager().sendMessage(textMsg);
})

音视频会话控制模块为EMCallSesssion,呼叫方通过asyncMakeCall返回,接听方通过监听回调的onRecvCallIncoming获取到。通过会话控制模块可以获取到以下会话信息

// 获取CallId
console.log(callsession.getCallId());
// 获取本地名称
console.log(callsession.getLocalName());
// 获取会话类型,0音频,1视频
console.log(callsession.getType());
// 获取对方名称
console.log(callsession.getRemoteName());
// 获取是否呼叫方
console.log(callsession.getIsCaller());
// 获取会话状态,0断开,1振铃,2正在连接,3已连接,4已接听
console.log(callsession.getStatus());
// 获取会话详情EMCallSessionStatistics
console.log(callsession.getStatistics());
// 获取会话扩展信息
console.log(callsession.getExt());
// 修改会话状态,0音频暂停,1音频恢复,2视频暂停,3视频恢复
console.log(callsession.update(controltype));