使用融云SDK在APICloud平台实现单人多人音频通话

简介: 使用之前必须先获取token、init、connect,同时需要到融云后台开通音视频通话功能(开通或者关闭30分钟后生效)。单人通话逻辑比较简单,主要会用到didReceiveCall、didConnect、didDisconnect等三个事件。多人通话逻辑复杂一点,并且只能应用在群组或者讨论组,会用到didReceiveCall、didConnect、remoteUserDidJoin、remoteUserDidLeft、remoteUserDidInvite、didDisconnect等六个事件。

一、效果展示

1.jpg

 

二、功能实现的思路

使用之前必须先获取token、init、connect,同时需要到融云后台开通音视频通话功能(开通或者关闭30分钟后生效

 

单人通话逻辑比较简单,主要会用到didReceiveCall、didConnect、didDisconnect等三个事件。

主要通话流程:

(1)发起通话

(2)监听来电

(3)接听或者挂断

 

多人通话逻辑复杂一点,并且只能应用在群组或者讨论组,会用到didReceiveCall、didConnect、remoteUserDidJoin、remoteUserDidLeft、remoteUserDidInvite、didDisconnect等六个事件。

主要通话流程:

(1)在组里选择几个成员发起通话

(2)成员收到来电

(3)成员接听或者挂断

(4)邀请几个成员加入当前通话

(5)被邀请组员收到来电

(6)被邀请组员接听或挂断来电

(7)通话组员监听是否有新成员加入或成员退出

 

为了让页面代码逻辑更简单,设计了四个页面

index.html(融云初始化、所有监听等主要业务代码)

receive-call.html(接收端业务代码,单人多人通话代码)

send-call.html(发送端业务代码,单人多人通话代码)

friends.html(群组或讨论组成员列表)

 

index.html首页融云初始化以及监听代码如下:

var rong = api.require('rongCloud2');
        rong.init(function (ret, err) {
            if (ret.status == 'success') {
                rong.connect({
                    token: $api.getStorage('token')
                }, function (ret, err) { 
                });
            }
        });
        //来电事件
        rong.addCallReceiveListener({
            target: 'didReceiveCall'
        }, function (ret) {
            if (ret.callSession.status) {
                var callType = 'more';
                if (ret.callSession.conversationType == 'PRIVATE') {
                    callType = 'one';
                }
                api.openWin({
                    name: 'receive-call',
                    url: 'receive-call.html',
                    pageParam: {
                        uid: ret.callSession.callerUserId,
                        userIdList: [ret.callSession.observerUserList],
                        callId: ret.callSession.callId,
                        callType: callType
                    },
                    animation: {type: "fade"}
                });
            }
        });
        //通话结束事件
        rong.addCallSessionListener({
            target: 'didDisconnect'
        }, function (ret) {
            api.sendEvent({
                name: 'didDisconnect'
            });
        });
        //对端挂断事件
        rong.addCallSessionListener({
            target

image.gif 

1、单人通话

调用startCall发起通话,需要注意userIdLis参数必填否则无法建立通话,对方也无法收到来电事件。

rong.startCall({
        targetId: '3001',    //用户id
        userIdList: ['3001'] //必填如果不填无法建立通话
    }, function (ret) {
        if (ret.callSession.callId) {
            api.openWin({
                name: 'send-call',
                url: 'send-call.html',
                pageParam: {
                    uid: '3000',                   //自己的用户id
                    userIdList: ['3001'],
                    callId: ret.callSession.callId,//发送者可以通过通话id挂断通话
                    callType: 'one'                //通话类型单人one 多人more
                },
                animation: { type: "fade"}
            })
        }
    })

 

发送端页面send-call.html需要处理来电接听事件(didConnect)以及通话结束事件(didDisconnect)、显示对方用户个人信息、通话计时。

 

当用户接听时就开始计时,时间格式00:00:00代码如下:

timer(){
                    var that = this
                    clearInterval(time)
                    time = setInterval(function () {
                        number++
                        var hour = that.add0(Math.floor(number / 60 / 60));
                        var min = that.add0(Math.floor(number / 60) % 60);
                        var s = that.add0(number % 60);
                        that.time = hour + ':' + min + ':' + s
                    }, 1000)
                }

image.gif 

Index.html页面监听来电事件并打开接收端页面receive-call.html并传递相关参数

rong.addCallReceiveListener({
            target: 'didReceiveCall'
        }, function (ret) {
            if (ret.callSession.status) {
                var callType = 'more';
                if (ret.callSession.conversationType == 'PRIVATE') {
                    callType = 'one';
                }
                api.openWin({
                    name: 'receive-call',
                    url: 'receive-call.html',
                    pageParam: {
                        uid: ret.callSession.callerUserId,
                        userIdList: [ret.callSession.observerUserList],
                        callId: ret.callSession.callId,
                        callType: callType
                    },
                    animation: {type: "fade"}
                });
            }
        });

image.gif 

接收端页面receive-call.html需要显示对方用户个人信息、通话计时、接听、挂断等。

当用户挂断或者自己挂断就关闭相应页面,长时间不接听系统自动触发通话结束事件。

 

2、多人通话

调用startCall发起通话,注意targetId为讨论组或者群组id,参数conversationType必填同时要和targetId类型保持一致,参数userIdLis里面用户必须是本群组或者讨论组成员同时不能填自己的id。

rong.startCall({
        targetId: 'group318', //群组或者讨论组id
        conversationType: 'GROUP',//必填必须和targetId类型保持一致。
        userIdList: ['3001','3002'] //不能填自己的id
    }, function (ret) {
        if (ret.callSession.callId) {
            api.openWin({
                name: 'send-call',
                url: 'send-call.html',
                pageParam: {
                    uid: '3000',                   //自己的用户id
                    userIdList: ['3001','3002'] ,
                    callId: ret.callSession.callId,//通话id
                    callType: 'more'               //通话类型单人one 多人more
                },
                animation: {type: "fade"}
            })
        }
    })

image.gif 

发送端页面send-call.html需要处理以下业务

通话已接通的事件(didConnect)

对端用户加入了通话的事件(remoteUserDidJoin)

对端用户挂断(remoteUserDidLeft)

有用户被邀请加入通话的事件(remoteUserDidInvite)

通话结束事件(didDisconnect)

以及显示和更新当前通话成员信息、通话计时。

//通话接通事件
        api.addEventListener({
            name: 'didConnect'
        }, function (ret, err) {
            vm.Connect = true
            vm.title = '通话中...'//改变通话状态
            vm.timer();//开始计时
        });
        //对端加入通话事件
        api.addEventListener({
            name: 'remoteUserDidJoin'
        }, function (ret, err) {
            var obj = vm.inData(ret.value.uid);
            for (var i = 0; i < vm.userList.length; i++) {
                var rs = vm.userList[i]
                if (ret.value.uid == rs.uid) {
                    rs.avatar = obj.avatar;//更新用户头像
                }
            }
        });
        //对端挂断电话
        api.addEventListener({
            name: 'remoteUserDidLeft'
        }, function (ret, err) {
            var obj = vm.inData(ret.value.uid);
            for (var i = 0; i < vm.userList.length; i++) {
                var rs = vm.userList[i]
                if (ret.value.uid == rs.uid) {
                    vm.userList.splice(i, 1);//删除用户数据
                }
            }
        });
        //通话结束
        api.addEventListener({
            name: 'didDisconnect'
        }, function (ret, err) {
            api.closeWin();
        });
        //邀请加入通话的事件
        api.addEventListener({
            name: 'remoteUserDidInvite'
        }, function (ret, err) {
            var rs = vm.inData(ret.value.uid);
            let obj = { uid: rs.uid, nickname: rs.nickname, avatar: '../res/user.png' }
            vm.userList.push(obj)
        });

image.gif 

当对端用户加入了通话时更新用户头像同时也通话计时,当对端用户挂断时移除该用户,当有用户被邀请加入通话时新增用户数据但是头像为灰色默认头像,当通话结束时关闭当前页。

 

接收端页面receive-call.html需要处理以下业务

对端用户加入了通话的事件(remoteUserDidJoin)

对端用户挂断(remoteUserDidLeft)

通话结束事件(didDisconnect)

以及显示和更新当前通话成员信息、计时。

 

监听代码如下:

//对端加入通话
        api.addEventListener({
            name: 'remoteUserDidJoin'
        }, function (ret, err) {
            var has = false
            for (var i in vm.userList) {
                if (vm.userList[i].uid == ret.value.uid) {
                    has = true
                    vm.userList[i].avatar = vm.inData(ret.value.uid).avatar;//更新用户头像
                }
            }
            if (has == false) {
                var rs = vm.inData(ret.value.uid);
                vm.userList.push(rs)//增加用户信息
            }
        });
        //对端挂断电话
        api.addEventListener({
            name: 'remoteUserDidLeft'
        }, function (ret, err) {
            var obj = vm.inData(ret.value.uid);
            for (var i = 0; i < vm.userList.length; i++) {
                var rs = vm.userList[i]
                if (ret.value.uid == rs.uid) {
                    vm.userList.splice(i, 1);//删除用户
                }
            }
        });
        //通话结束
        api.addEventListener({
            name: 'didDisconnect'
        }, function (ret, err) {
            api.closeWin();
        });

image.gif 

当自己接听电话时开始计时,当对端用户加入了通话时新增用户信息,当对端用户挂断时移除该用户,当通话结束时关闭当前页,长时间不接听系统自动触发通话结束事件。

目录
相关文章
|
2月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
3月前
|
编解码 开发工具 C#
[大牛直播SDK]Windows平台RTMP直播推送模块功能设计
大牛直播SDK采用全自研框架,具备高度可扩展性与自适应算法,显著降低延迟并提高采集编码效率。SDK以模块化设计,支持RTMP推流及多种音视频编码格式(如AAC、SPEEX、H.264、H.265),并能与播放器SDK组合实现丰富功能,包括流媒体转发、内置RTSP服务等。提供了详尽的参数配置选项,支持多摄像头、屏幕采集与水印叠加,并兼容Windows 7及以上操作系统。该SDK以C++/C#双接口形式提供,集成简便,同时包含调试与发布版本库,便于开发者快速上手。此外,支持断网重连、实时预览及多种编码前后的数据对接需求。
|
3月前
|
Web App开发 网络协议 Android开发
### 惊天对决!Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【8月更文挑战第14天】随着移动互联网的发展,实时音视频通信已成为移动应用的关键部分。本文对比分析了Android平台上WebRTC、RTMP与RTSP三种主流技术方案。WebRTC提供端到端加密与直接数据传输,适于高质量低延迟通信;RTMP适用于直播场景,但需服务器中转;RTSP支持实时流播放,但在复杂网络下稳定性不及WebRTC。三种方案各有优劣,WebRTC功能强大但集成复杂,RTMP和RTSP实现较简单但需额外编码支持。本文还提供了示例代码以帮助开发者更好地理解和应用这些技术。
144 0
|
编解码 Java 开发工具
[技术分享]Android平台实时音视频录像模块设计之道
录像有什么难的?无非就是数据过来,编码保存mp4而已,这可能是好多开发者在做录像模块的时候的思考输出。是的,确实不难,但是做好,或者和其他模块有非常好的逻辑配合,确实不容易。
104 0
|
Web App开发 存储 机器人
开源,在线 P2P 文件传输、屏幕共享、音视频通话工具
这是一个基于 WebRTC 协议的开源在线工具箱,主要功能包括在线文件传输、本地屏幕录制,远程屏幕共享,远程音视频通话,密码房间、直播等功能。支持私有部署,打开浏览器即开即用
503 0
|
Web App开发 移动开发 算法
关于 TRTC (实时音视频通话模式)在我司的实践 #78
关于 TRTC (实时音视频通话模式)在我司的实践 #78
333 0
|
编解码 vr&ar 开发工具
VR视频加密SDK方案一机一码
VR视频加密解决方案可参考以下几种方式:**1、针对特定场景提供定制化加密方案****2、提供加解密SDK对接服务****3、直接使用成品视频加密软件系统**
162 0
VR视频加密SDK方案一机一码
|
JSON API 图形学
Unity 接入高德开放API - 天气查询
Unity 接入高德开放API - 天气查询
510 1
Unity 接入高德开放API - 天气查询
|
编解码 Android开发 iOS开发
使用APICloud开发app录音功能
mp3Recorder模块封装在iOS、Android下录音直接生成mp3,统一两个平台的录音生成文件,方便双平台之间的交互,减少录音完成后再转码的过程;同时提供分贝波形图显示UI;使用该模块前需要打开麦克风权限。
275 0
|
Web App开发 网络虚拟化
使用 WebRTC 构建简单的视频聊天室(1)
使用 WebRTC 构建简单的视频聊天室(1)
419 0