前言

大家好,今天小编带给大家一个基于 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 实现音视频呼叫功能的更多相关文章

  1. 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解

    http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...

  2. HTML躬行记(4)——Web音视频基础

    公司目前的业务会接触比较多的音视频,所以有必要了解一些基本概念. 文章涉及的一些源码已上传至 Github,可随意下载. 一.基础概念 本节音视频的基础概念摘自书籍<FFmpeg入门详解 音视频 ...

  3. 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化

    本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...

  4. 音视频技术“塔尖”之争,网易云信如何C位出道?

    音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...

  5. 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。

    项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ...

  6. 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧

    zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...

  7. 史上最全的音视频SDK包分享给大家

    史上最全的音视频SDK包分享给大家 概述一下SDK功能: 项目 详情视频通信  支持多种分辨率的视频通信语音通信  提供语音通信,可支持高清宽带语音动态创建房间  可以根据需要,随时创建房间H5 支持 ...

  8. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

  9. 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用

    疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...

随机推荐

  1. 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作

    目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...

  2. .Net Core Host 之详解

    简介: 开发使用有三年经验了,想趁这个机会把net core的知识点梳理一下,也更好的研究一下.NET 5给我们带来的变化. 主机的概念: 一个主机是封装了应用程序的资源,比如一个对象: 依赖注入 ( ...

  3. 六、JavaSE语言基础之数组

    一维数组(关键字[]) 关于数组的一些概念: 数组是多个基本数据有机组合形成一个复杂数据,是一个引用数据类型数据. 数组:装指定数量元素类型相同的数据的容器. 元素:在数组中,数组中的每个数据称之为数 ...

  4. 关于.Net Core使用Elasticsearch(俗称ES)、Kibana的研究说明

    关于ElasticSearch Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本.数字.地理空间.结构化和非结构化数据.Elasticsearch 在 Apa ...

  5. POJ 1279 Art Gallery 半平面交 多边形的核

    题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...

  6. 一小时搞懂Mysql锁机制

    内容概述: 我们知道,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对 ...

  7. Redis为什么变慢了?常见延迟问题定位与分析

    Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右.但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头 ...

  8. MySQL中的联表查询与子查询

    0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...

  9. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  10. Linux常用命令 day day up系列3

    一.命令执行的优先级二.Linux目录结构三.cat--查看文件内容四.more--查看文件内容五.less--查看文件内容六.head.tail--查看文件内容七.wc--统计文件内容八.grep- ...