点对点音视频通话

点对点音视频通话功能包含点对点的音频通话和点对点的音视频通话,提供呼叫接听挂断话单通知等功能。通过阅读该章节,您可以快速了解点对点实时音视频通话的流程,帮助您迅速搭建一个最简单的点对点实时音视频通话功能。

呼叫/接听流程

sequenceDiagram 主叫->>被叫: 主叫发起通话请求: netcall.call 被叫->>被叫: 被叫收到呼叫请求通知: netcall.on('beCalling', obj => {}) 被叫->>主叫: 被叫响应通话请求: netcall.response 被叫->>被叫: 呼入的通话已经被该帐号其他端处理通知: netcall.on('callerAckSync', obj => {}) 主叫->>主叫: 主叫收到被叫响应通知-接受: netcall.on('callAccepted', obj => {}) 主叫->>主叫: 主叫收到被叫响应通知--拒绝: netcall.on('callRejected', obj => {}) 主叫->>主叫: 呼叫应答完成, 开始建立音视频连接 被叫->>被叫: 呼叫应答完成, 开始建立音视频连接

主叫发起通话请求

netcall
  .call({
    type: type, // 通话类型:1音频,2视频
    callee: callee, // 被叫账号
    forceKeepCalling: true // 持续呼叫
  })
  .then(function() {
    // 成功发起呼叫
    console.log('呼叫成功!')
  })
  .catch(function(err) {
    console.error(error)
  });
// 设置超时计时器
let callTimer = setTimeout(function() {
  // 请在对方处理后,清除呼叫定时器,否则将执行挂断逻辑
  console.log('超时未接听, hangup');
  netcall.hangup();
}, 1000 * 30);
参数名 类型 说明
type number 通话类型:1音频,2视频
account string 呼叫对方账号(IM账号)
forceKeepCalling Boolean 是否开启持续呼叫,true是开启持续呼叫

被叫收到呼叫通知

let infoOfBeCalled = null
netcall.on('beCalling', (obj) => {
  console.log('beCalling')
  console.log(obj)
  infoOfBeCalled = obj
})
obj 属性 类型 说明
caller string 主叫 account
type number 主叫发起的通话类型(音频还是视频)
cid string 此通通话的唯一 ID 值,开发者可用于判断是否是同一通呼叫

被叫响应通话请求

// 接听

// 告知对方,接听本通通话
netcall.response({
  accepted: true, // 是否接听,true为接听;false为拒绝
  // infoOfBeCalled为前面被叫时传递过来的信息
  caller: infoOfBeCalled.caller, // 本通通话主叫方账号
  type: infoOfBeCalled.type, // 本通通话类型
  cid: infoOfBeCalled.cid // 本通通话房间ID
})
  .then(() => {
    // 开启本端的音视频通话
    netcall.startRtc({ mode: 0 })
      .then((obj) => {
        // obj结构 => {uid,account,cid}
        console.log('开启音视频成功', obj)
      })
  })
  .catch((error) => {
    console.error(error)
  })


// 拒绝

// 告知对方,拒绝本通通话
netcall.response({
  accepted: false,
  // infoOfBeCalled为前面被叫时传递过来的信息
  caller: infoOfBeCalled.caller, 
  type: infoOfBeCalled.type,
  cid: infoOfBeCalled.cid
})
  .then(() => {
    console.log('拒绝成功')
  })
  .catch((error) => {
    console.error(error)
  })

主叫收到被叫响应回调

// 被叫拒绝的通知
netcall.on('callRejected', function(obj) {
  console.log('被叫拒绝了', obj);
  // 清除呼叫定时器
  clearCallTimer();
  // 清除用户UI逻辑(例如清除呼叫界面)
});

// 被叫接受的通知
netcall.on('callAccepted', function(obj) {
  console.log('on 被叫接听了', obj);
  // 缓存呼叫类型,后面开启音视频连接需要用到
  type = obj.type;
  // 清除呼叫定时器
  clearCallTimer();
  // 开启音视频逻辑
  netcall.startRtc({ mode: 0 })
  .then((obj) => {
    // obj结构 => {uid,account,cid}
    console.log('开启音视频成功', obj)
  })
});

呼入的通话已经被该帐号其他端处理

netcall.on('callerAckSync', function(obj) {
  console.log('其他端已经处理了本通通话', obj);
});

obj 为其他端已处理的回调对象

obj 属性 类型 说明
timetag string 时间戳
cid string 当前通话的唯一 id 值
type number 通话类型:音频、视频
accepted bool 其他端做出的应答:接受、拒绝
fromClientType string 从什么类型的终端做出的应答:IOS、Android 等

开启音视频通话

graph TB A(Start) --> C[设置live-pusher的camera和muted状态] C --> D[netcall.startRtc: 开启音视频连接] D --> E[netcall.on: 监听syncDone事件,回调是加入时已处于房间中的用户列表] E --> F[netcall.on: 监听clientJoin事件,回调是新加入房间的用户信息] F --> G[netcall.on: 监听clientLeave事件,回调是离开房间用户信息] G --> H(End)
const netcall = this.netcall // 音视频操作实例
// 开启音视频逻辑,mode表示加入方式,被叫时可在被叫回调中获取,主叫则自行设定
netcall.startRtc({ mode: type })
  .then((obj) => {
    // {uid,account,cid}
    console.log('开启音视频成功', obj)
    self.loginUser = obj
  })
netcall.on('syncDone', (obj) => {
  // obj => {code,errmsg,userlist:[{account, mode, pusher_secret, scene, uid,url}]}
  console.log('登录成功', obj)
  // 将获取过来的用户数据中的url设置到live-pusher或live-player组件上去
})
netcall.on('clientJoin', (obj) => {
  // obj => {account,cid,mode,uid,url}
  console.log('有用户加入', obj)
  // 将新加入的用户的url设置到live-player组件上去
})
netcall.on('clientLeave', (obj) => {
  // obj => {account,uid,id}
  console.log('有用户加入', obj)
  // 将离开的用户对应的live-player的url去除,并停止拉流
})

结束通话

// 主动挂断方调用此API
netcallInstance.hangup()
  .then(() => {
    console.log('挂断成功')
    // 清除对应的UI逻辑。。。
  })
  .catch((error) => {
    console.error(error)
  })

收到对方的挂断通知

// 对方收到挂断通知
netcallInstance.on('hangup', (obj) => {
  console.log('hangup--对端挂断了', obj)
  // 判断收到的挂断通知是否是本通通话
  if (obj.cid !== this.loginUser.cid) {
    console.warn('非本通通话,抛弃')
    return
  }
  // 清除对应的UI逻辑。。。
})

obj 收到的挂断通知对象

obj 属性 类型 说明
timetag string 时间戳
cid string 当前通话的唯一 id 值
account string 对方账号