- 将代码保存为html放入服务器中(可以使用nginx)
- 本demo使用PC Agent方案集成需要安装插件
- SDK下载
- 登录网易云信运行demo添加
greatcs4
好友,发起通话(可以用手机端微信小程序发起)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#container,
#remoteContainer {
width: 480px;
height: 640px;
float: left;
border: 1px solid;
}
</style>
</head>
<body>
<div id="container"></div>
<div id="remoteContainer"></div>
<button onclick="beCall()">接听</button>
</body>
<script src="./NIM_Web_NIM_v6.8.0.js"></script>
<script src="./NIM_Web_Netcall_v6.8.0.js"></script>
<script>
NIM.use(Netcall);
var data = {};
// 注意这里, 引入的 SDK 文件不一样的话, 你可能需要使用 SDK.NIM.getInstance 来调用接口
var nim = NIM.getInstance({
// debug: true,
appKey: '45c6af3c98409b18a84451215d0bdd6e',
account: 'greatcs4',
token: 'e10adc3949ba59abbe56e057f20f883e',
// privateConf: {}, // 私有化部署方案所需的配置
onconnect: onConnect,
onwillreconnect: onWillReconnect,
ondisconnect: onDisconnect,
onerror: onError
});
function onConnect() {
console.log('连接成功');
}
function onWillReconnect(obj) {
// 此时说明 SDK 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
console.log('即将重连');
console.log(obj.retryCount);
console.log(obj.duration);
}
function onDisconnect(error) {
// 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
console.log('丢失连接');
console.log(error);
if (error) {
switch (error.code) {
// 账号或者密码错误, 请跳转到登录页面并提示错误
case 302:
break;
// 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误
case 417:
break;
// 被踢, 请提示错误后跳转到登录页面
case 'kicked':
break;
default:
break;
}
}
}
function onError(error) {
console.log(error);
}
const netcall = Netcall.getInstance({
kickLast: false,
nim: nim,
container: document.getElementById('container'),
remoteContainer: document.getElementById('remoteContainer'),
mirror: true,
mirrorRemote: true
});
var signalInited = false;
// 信令通道初始化完毕之后, 开发者可以启用音视频通话相关的 UI, 比如说展示呼叫别人的按钮
// 信令通道初始化失败的时候, 请展示错误并禁用所有音视频通话相关的 UI
netcall
.initSignal()
.then(function () {
console.log('signalInited');
signalInited = true;
})
.catch(function (err) {
console.log('initSignalError', err);
signalInited = false;
});
// 当信令通道断开时, 会触发 signalClosed 事件
netcall.on('signalClosed', function () {
console.log('on signalClosed');
signalInited = false;
netcall.hangup();
});
// 初始化过程中会通过 devices 事件回传所有的设备列表
netcall.on('devices', function (obj) {
console.log('on devices', obj);
});
// 是否被叫中
let beCalling = false;
// 呼叫类型
let type = null;
// 被叫信息
let beCalledInfo = null;
// 是否正忙
let busy = false;
// 开启监听
netcall.on('beCalling', function (obj) {
console.log('on beCalling', obj);
const channelId = obj.channelId;
// 被叫回应主叫自己已经收到了通话请求
netcall.control({
channelId: channelId,
command: Netcall.NETCALL_CONTROL_COMMAND_START_NOTIFY_RECEIVED
});
// 只有在没有通话并且没有被叫的时候才记录被叫信息, 否则通知对方忙并拒绝通话
if (!netcall.calling && !beCalling) {
type = obj.type;
beCalling = true;
beCalledInfo = obj;
} else {
if (netcall.calling) {
busy = netcall.notCurrentChannelId(obj);
} else if (beCalling) {
busy = beCalledInfo.channelId !== channelId;
}
if (busy) {
netcall.control({
channelId: channelId,
command: Netcall.NETCALL_CONTROL_COMMAND_BUSY
});
// 拒绝通话
netcall.response({
accepted: false,
beCalledInfo: obj
});
}
}
});
// 被叫接受的通知
netcall.on('callAccepted', function (obj) {
console.log('on callAccepted', obj);
// 如果呼叫之前,启动了超时倒计时,这里可以取消呼叫倒计时
//clearCallTimer();
// 可以开启音视频连接操作。。。
startDevice();
});
// 被叫拒绝的通知
netcall.on('callRejected', function (obj) {
console.log('on callRejected', obj);
// 如果呼叫之前,启动了超时倒计时,这里可以取消呼叫倒计时
clearCallTimer();
// 挂断
hangup();
// 做清理工作
//resetWhenHangup();
});
netcall.on('hangup', function (obj) {
console.log('on hangup', obj);
// 判断需要挂断的通话是否是当前正在进行中的通话
if (!beCalledInfo || beCalledInfo.channelId === obj.channelId) {
// 清理工作
//resetWhenHangup();
}
});
netcall.on('callerAckSync', function (obj) {
console.log('其他端已经做了处理', obj);
});
netcall.on('error', function (obj) {
console.log('sdk反馈错误信息', obj);
if (obj.code) {
if (obj.code == 509) {
console.warn('你被提出房间了');
}
else if (obj.code == 500) {
console.warn('你的web不支持H264视频编码,无法进行呼叫,请检测浏览器的H264插件是否正常');
}
}
});
function beCall() {
netcall.response({
accepted: true,
beCalledInfo: beCalledInfo,
sessionConfig: {
videoQuality: Netcall.CHAT_VIDEO_QUALITY_HIGH,
videoFrameRate: Netcall.CHAT_VIDEO_FRAME_RATE_15,
videoBitrate: 0,
recordVideo: false,
recordAudio: false,
highAudio: false,
bypassRtmp: false,
rtmpUrl: '',
rtmpRecord: false,
splitMode: Netcall.LAYOUT_SPLITLATTICETILE
}
}).catch(function (err) {
//reject();
console.log('接听失败', err);
});
}
function startDevice() {
// 连接媒体网关
// 开启麦克风
netcall.startDevice({
type: Netcall.DEVICE_TYPE_AUDIO_IN
}).then(function () {
// 通知对方自己开启了麦克风
netcall.control({
command: Netcall.NETCALL_CONTROL_COMMAND_NOTIFY_AUDIO_ON
})
}).catch(function (err) {
console.log('启动麦克风失败')
console.log(err)
})
// 开启摄像头
netcall.startDevice({
type: Netcall.DEVICE_TYPE_VIDEO,
width: 640,
height: 480
}).then(function () {
// 通知对方自己开启了摄像头
netcall.control({
command: Netcall.NETCALL_CONTROL_COMMAND_NOTIFY_VIDEO_ON
})
}).catch(function (err) {
// 通知对方自己的摄像头不可用
netcall.control({
command: Netcall.NETCALL_CONTROL_COMMAND_SELF_CAMERA_INVALID
})
console.log('启动摄像头失败')
console.log(err)
})
// 开启本地视频预览
netcall.startLocalStream()
// 开启远程视频预览
netcall.startRemoteStream()
// 开启本地音频播放
netcall.startDevice({
type: Netcall.DEVICE_TYPE_AUDIO_OUT_CHAT
}).catch(function (err) {
console.log('播放对方的声音失败')
console.log(err)
})
// 设置本地音量采集大小, 该API可以在通话过程中动态调用调整自己的音量采集大小
netcall.setCaptureVolume(55)
// 设置本地音量播放大小, 该API可以在通话过程中动态调用调整自己的音量播放大小(即自己听对端的音量)
netcall.setPlayVolume(55)
// 设置本地视频画面大小
netcall.setVideoViewSize({
width: 640,
height: 480,
cut: true
})
// 设置对端视频画面大小
netcall.setVideoViewRemoteSize({
width: 640,
height: 480,
cut: true
})
}
</script>
</html>