anyRTC Web SDK 实现音视频呼叫功能
前言
大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发)。
前提条件
在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC Web SDK 这里还需要花几分钟时间准备一下, 详见:开发前期准备
操作流程
下载并引入项目依赖
npm i ar-rtm-sdk -S
npm i ar-rtc-sdk -S
import ArRTM from 'ar-rtm-sdk';
import ArRTC from 'ar-rtc-sdk';
import config from '../config';
config.js
export default {
    appid: '', // anyRTC 控制台生成的 appid (详见前提条件)
    uid: 'web' + Math.floor(Math.random() * 10000000) // 随机生成本地uid
}
data 初始数据
data() {
    return {
        localInvitation: null, // 通过 ArRTMClient.createLocalInvitation 创建的实例
        ArRTMClient: null,     // 通过 ArRTM.createInstance 创建的RTM客户端实例
        ArRTCClient: null,     // 通过 ArRTC.createClient 创建的客户端对象
        audioTrack: null,      // 本地音频轨道
        videoTrack: null,      // 本地视频轨道
        audioDevices: [],      // 本地音频设备列表
        videoDevices: []       // 本地视频设备列表
        remoteUid: ''          // 远端用户的 uid
    }
}
mounted
mounted() {
    this.getRemoteUid(); // 获取远程用户 uid
    this.getDevices();   // 获取音视频设备
    this.createTrack();  // 创建本地音视频轨道
},
methods
// 获取远端用户 uid (这一步可以用输入框代替)
getRemoteUid() {
    const remoteUid = this.$route.query.uid;
    if (remoteUid) {
        this.remoteUid = remoteUid;
        this.createClient();
    }
},
// 获取音视频设备
async getDevices() {
    const [ videoDevices, audioDevices ] = await Promise.all([
        ArRTC.getCameras(),
        ArRTC.getMicrophones(),
    ]);
    this.videoDevices = videoDevices;
    this.audioDevices = audioDevices;
},
// 创建本地音视频轨道
async createTrack() {
    this.audioTrack = await ArRTC.createMicrophoneAudioTrack();
    // 如果没有摄像头设备就不创建视频轨道
    if (this.videoDevices.length) {
        this.videoTrack = await ArRTC.createCameraVideoTrack();
    }
},
// 创建 RTM 和 RTC 客户端对象
createClient() {
    this.ArRTMClient = ArRTM.createInstance(config.appid);
    this.ArRTCClient = ArRTC.createClient({ mode: 'rtc', codec: 'h264' });
    // 监听远端用户发布音视频流
    this.listenUserPublished();
    // 监听点对点消息
    this.listenMessageFromPeer();
    // 登录 RTM
    this.ArRTMClient.login({ uid: config.uid }).then(() => {
        // 监听远端用户上下线
        this.listenPeersOnlineStatusChanged();
        // 订阅人员上下线
        this.subscribePeersOnlineStatus();
    }).catch((err) => {
        console.log(err);
    });
},
// 监听点对点消息 (这里主要的作用就是远端通过rtm消息,告诉我们他的一些状态)
listenMessageFromPeer() {
    this.ArRTMClient.on('MessageFromPeer',  message => {
        // 状态码自己约定
        if (message.text === '100') {
             // 对方正在通话中
        } else if (message.text === '200') {
            // 对方挂断 我们也要离开房间
            this.handleLeave();
        }
    });
},
// 监听远端用户发布音视频流
listenUserPublished() {
    this.ArRTCClient.on("user-published", async (user, mediaType) => {
        await this.ArRTCClient.subscribe(user, mediaType);
        this.inTheCall = true;
        if (mediaType === 'video') {
            // 播放远端视频 (传入一个dom元素id)
            user.videoTrack.play('#remote_video');
        } else if (mediaType === 'audio') {
            // 播放远端音频 (音频不需要元素)
            user.audioTrack.play();
        }
    });
},
// 监听远端用户上下线
listenPeersOnlineStatusChanged() {
    this.ArRTMClient.on('PeersOnlineStatusChanged', (status) => {
        const ONLINE = status[this.remoteUid] === 'ONLINE';
        // 如果对方在线 就发送呼叫邀请
        ONLINE && this.callRemote(this.remoteUid);
    });
},
// 监听 localInvitation 状态
localInvitationListen() {
    // 被叫已接受呼叫邀请时触发
    this.localInvitation.on('LocalInvitationAccepted', (response) => {
        // 对方同意接听 本地加入频道
        this.joinChannel();
        console.log(response, '被叫已接受呼叫邀请时触发')
    });
},
// 加入频道
joinChannel() {
    this.ArRTCClient.join(config.appid, config.uid, null, config.uid).then(() => {
        this.videoTrack && this.videoTrack.play('local_video');
        // 发布本地音视频
        this.audioTrack && this.ArRTCClient.publish(this.audioTrack);
        this.videoTrack && this.ArRTCClient.publish(this.videoTrack);
    }).catch((err) => {
        console.log(err);
    });
},
// 订阅人员上下线
subscribePeersOnlineStatus() {
    this.ArRTMClient.subscribePeersOnlineStatus([this.remoteUid]);
},
// 呼叫远端用户
callRemote() {
    // 创建一个 LocalInvitation 实例
    this.localInvitation = this.ArRTMClient.createLocalInvitation(this.remoteUid);
    // 监听 localInvitation 状态
    this.localInvitationListen();
    // 发起呼叫
    this.localInvitation.send();
},
// 挂断
handleLeave() {
    // 离开频道
    this.ArRTCClient.leave();
    // 取消已发送的呼叫邀请
    this.localInvitation.cancel();
},
HTML
<!-- 挂断 -->
<div class='hangUp' @click='handleLeave'>
    <img src="../assets/images/hangUp.png" alt="">
</div>
<!-- 重新呼叫 -->
<div class='replay' @click='callRemote'>
    <div>
        <img src="../assets/images/replay.png" alt="">
    </div>
    <p>重新呼叫</p>
</div>
<!-- 本地视频容器 -->
<div id='local_video'></div>
<!-- 远端视频容器 -->
<div id='remote_video'></div>
CSS
<style lang='less' scoped>
#call {
    position: fixed;
    z-index: 90;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    .hangUp {
        position: fixed;
        z-index: 999;
        left: 0;
        right: 0;
        bottom: 100px;
        margin: auto;
        width: 78px;
        height: 78px;
        cursor: pointer;
    }
    .replay {
        position: fixed;
        z-index: 999;
        left: 0;
        right: 0;
        bottom: 100px;
        margin: auto;
        display: flex;
        flex-direction: column;
        align-items: center;
        div {
            width: 78px;
            height: 78px;
            cursor: pointer;
        }
        p {
            margin-top: 17px;
            font-size: 16px;
            font-family: PingFang, PingFang-Regular;
            font-weight: 400;
            color: #fff;
        }
    }
    #local_video {
        position: fixed;
        z-index: 300;
        top: 38px;
        left: 32px;
        width: 297px;
        height: 167px;
    }
    #remote_video {
        position: fixed;
        z-index: 200;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
    }
}
</style>
anyRTC Web SDK 实现音视频呼叫功能的更多相关文章
- 集显也能硬件编码:Intel SDK   && 各种音视频编解码学习详解
		http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ... 
- HTML躬行记(4)——Web音视频基础
		公司目前的业务会接触比较多的音视频,所以有必要了解一些基本概念. 文章涉及的一些源码已上传至 Github,可随意下载. 一.基础概念 本节音视频的基础概念摘自书籍<FFmpeg入门详解 音视频 ... 
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
		本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ... 
- 音视频技术“塔尖”之争,网易云信如何C位出道?
		音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ... 
- 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。
		项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ... 
- 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧
		zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ... 
- 史上最全的音视频SDK包分享给大家
		史上最全的音视频SDK包分享给大家 概述一下SDK功能: 项目 详情视频通信 支持多种分辨率的视频通信语音通信 提供语音通信,可支持高清宽带语音动态创建房间 可以根据需要,随时创建房间H5 支持 ... 
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
		之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ... 
- 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
		疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ... 
随机推荐
- mybatis入“坑”第一步
			一.导入坐标 要想通过maven创建一个简单的mybatis项目,首先需要的是要导入相关的坐标.需要导入的坐标如下: <dependencies> <!--mysql驱动坐标--&g ... 
- WPF中ListView控件怎么添加新的tiem时滚动条一直在最下面
			listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]) 
- 透彻理解USB总线应用之枚举
			Hello,大家好,今天我们来讨论一下USB总线中的枚举(Enumeration),首先简单介绍一下USB系统的基本架构,它由USB主机.USB设备与USB电缆(本文忽略它)组成,如下图所示: 最常见 ... 
- Windows下安装kubectl及Node和Pod操作常用命令
			kubernetes通过kube-apiserver作为整个集群管理的入口.Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也 ... 
- kubernetes ceph-csi分析
			概述 最近在做分布式存储ceph接入kubernetes,用的是csi这一套,在开发的过程中,自己也用有道云笔记做过一些ceph-csi相关的源码分析.知识总结之类的记录,刚好自己又萌生了发博的想法, ... 
- 第6章:深入理解Pod对象
			Pod是最小的部署单元,也是后面经常配置的地方,本章节带你熟悉Pod中常见资源配置及参数. 也就是YAML这部分: ... template: metadata: labels: app: web s ... 
- 14.6、redis集群
			1.环境配置: 服务器名称 ip地址 实例6379 实例6380 实例6381 实例6381 实例6381 实例6381 controller-node1 172.16.1.90 主 从 主 从 主 ... 
- Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
			前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ... 
- hdu 2842 Chinese Rings 矩阵快速幂
			分析: 后面的环能不能取下来与前面的环有关,前面的环不被后面的环所影响.所以先取最后面的环 设状态F(n)表示n个环全部取下来的最少步数 先取第n个环,就得使1~n-2个环属于被取下来的状态,第n-1 ... 
- 在jsp中显示List中的数据
			<% ArrayList list = (ArrayList)request.getAttribute("class"); for(int i = 0; i < lis ... 
