网易云信--音视频通话

  1. 将代码保存为html放入服务器中(可以使用nginx)
  2. 本demo使用PC Agent方案集成需要安装插件
  3. SDK下载
  4. 登录网易云信运行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>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,742评论 0 15
  • 这颜色选的也是没谁了 美个图 话说今天真的好热
    zhaonannan阅读 198评论 0 0
  • chu蓝色水晶阅读 161评论 0 0
  • 2818年4月14日 周六 大风 周六早上我木有跟往常一样早起来健身,因为最近顾客多,体力有些透支了...
    张志成娘阅读 248评论 0 2
  • 歲月不居 時節如流。 一年的時光指縫間細細劃過,點點痕跡,表達著曾經。 這一年,所到之處,收集更多的自...
    AmyLam海燕阅读 523评论 0 3